POJ 1321 棋盘问题
题意:给一个棋盘,和棋子数,问有几种方案。
思路:用Dfs进行搜索,记录搜索过的行,进行标记,然后搜索下一行,如果棋子放完了ans++,最后输出ans.
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 char Map[20][20]; 7 int vis[20]; 8 int m,n,ans; 9 int Dfs(int x,int y){ 10 if(y>m){//如果棋子放完了,方案数加一 11 ans++; 12 return 0; 13 } 14 for(int i=x;i<=n;i++){//i记录行 15 for(int j=1;j<=n;j++){//j记录列 16 if(Map[i][j]=='#'&&!vis[j]){//如果i行j列能放置棋子,就标记一下 17 vis[j]=1; 18 Dfs(i+1,y+1);//递归遍历下一个可以放置的位置 19 vis[j]=0;//回溯 20 } 21 } 22 } 23 return 0; 24 } 25 int main() 26 { 27 while(cin>>n>>m&&n!=-1&&m!=-1){ 28 ans=0;//ans置零 29 for(int i=1;i<=n;i++){ 30 for(int j=1;j<=n;j++){ 31 cin>>Map[i][j]; 32 } 33 } 34 memset(vis,0,sizeof(vis)); 35 Dfs(1,1); 36 cout<<ans<<endl; 37 } 38 return 0; 39 }
浙公网安备 33010602011771号