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 }

 

posted on 2018-11-14 20:10  //joker  阅读(69)  评论(0)    收藏  举报