题目链接:棋盘问题
解析:dfs暴力从上到下、从左到右搜索。
AC代码:
//代码1 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int n, k, ans; char maze[10][10]; bool vis[10][10]; void dfs(int x, int y, int step){ if(step == k){ ans ++; return ; } for(int i=x; i<n; i++) for(int j=(i == x ? y : 0); j<n; j++){ if(!vis[i][j] && maze[i][j] == '#'){ bool used[10][10]; memset(used, false, sizeof(used)); for(int p=0; p<n; p++) //保存标记 for(int q=0; q<n; q++) used[p][q] = vis[p][q]; for(int p=0; p<n; p++){ vis[i][p] = true; vis[p][j] = true; } dfs(i, j, step+1); for(int p=0; p<n; p++) //标记还原 for(int q=0; q<n; q++) vis[p][q] = used[p][q]; } } } int main(){ // freopen("in.txt", "r", stdin); while(scanf("%d%d", &n, &k) == 2){ if(n == -1 && k == -1) break; for(int i=0; i<n; i++) for(int j=0; j<n; j++) cin>>maze[i][j]; ans = 0; memset(vis, false, sizeof(vis)); dfs(0, 0, 0); printf("%d\n", ans); } return 0; }
//代码2 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int n, k, ans; char maze[10][10]; bool vx[10], vy[10]; void dfs(int x, int y, int step){ if(step == k){ ans ++; return ; } for(int i=x; i<n; i++) for(int j=(i == x ? y : 0); j<n; j++){ if(!vx[i] && !vy[j] && maze[i][j] == '#'){ vx[i] = true; //标记 vy[j] = true; dfs(i, j, step+1); vx[i] = false; //标记还原 vy[j] = false; } } } int main(){ // freopen("in.txt", "r", stdin); while(scanf("%d%d", &n, &k) == 2){ if(n == -1 && k == -1) break; for(int i=0; i<n; i++) scanf("%s", maze[i]); ans = 0; memset(vx, false, sizeof(vx)); memset(vy, false, sizeof(vy)); dfs(0, 0, 0); printf("%d\n", ans); } return 0; }
版权声明:本文为sxk原创文章,转载请附加本文链接^_^
时间: 2024-11-05 18:34:44