n * m的棋盘,从左上角走到右下角,每次只能往下或者往右走到相邻格子,有多少条路径上的数字是各不相同的?

#include <bits/stdc++.h>
using namespace std;
int n, m, i, j, k, s, a[15][15];
map <int, int> f;
void dfs(int x, int y){
    if(f[a[x][y]]) return;//不能出现重复数字
    if(x==n && y==m) s++;//路径数量加1
    f[a[x][y]] = 1;
    dfs(x+1, y);//往下
    dfs(x, y+1);//往右
    f[a[x][y]] = 0;
}
int main(){
    scanf("%d%d", &n, &m);
    for(i=1; i<=n; i++){
        for(j=1; j<=m; j++){
            scanf("%d", &a[i][j]);
        }
    }
    dfs(f[0]=1, 1);//爆搜
    printf("%d\n", s);
    return 0;
}

作者 crxis

发表回复