poj 1321 棋盘问题

xiaoxiao2025-08-25  134

题目  中文题目,题意不在赘述,思路代码中。

#include <iostream> #include <cstring> #include <cstdio> using namespace std; char mp[10][10]; int vis[10]; int cnt = 0; int n,k; /** 采用的是按行递增的顺序来搜索的, 因此不可能出现同行的情况, 对于同列的情况,设置一个变量vis[],来保存列的访问状态, 对于之前访问过的列, 棋子是不能再放在这一列上的. */ int dfs(int x,int y)//第x行,放第y颗棋子 { if(y>=k){ cnt++;//记录这个方案可行 return 0; } for(int i=x;i<n;i++) { for(int j=0;j<n;j++) { if(mp[i][j]=='#'&&!vis[j]) { vis[j]=1; dfs(i+1,y+1);//搜素下一行 vis[j]=0; } } } return 0; } int main() { while(cin>>n>>k) { if(n==-1&&k==-1) break; for(int i=0;i<n;i++) cin>>mp[i]; memset(vis,0,sizeof(vis)); cnt = 0; dfs(0,0); cout<<cnt<<endl; } return 0; } #include <iostream> #include <cstdio> #include <cstring> using namespace std; char mp[10][10]; int vis[10]; int res = 0,n,k,cnt=0; void dfs(int x) { if(cnt==k){ res++; return ; } if(x<0||x>=n) return ; for(int j=0;j<n;j++) { if(mp[x][j]=='#'&&vis[j]==0){ cnt++; vis[j]=1; dfs(x+1); vis[j]=0; cnt--; } } dfs(x+1); } int main() { while(cin>>n>>k) { if(n==-1&&k==-1) break; for(int i=0;i<n;i++) cin>>mp[i]; dfs(0); cout<<res<<endl; memset(mp,0,sizeof(0)); res = 0; } return 0; }

 

转载请注明原文地址: https://www.6miu.com/read-5035225.html

最新回复(0)