棋盘问题 POJ - 1321

原题链接

考察:dfs

这题我不会写...rz果然不配搞OI

看了别人代码后的思路:
        一开始思路是一个位置一个位置搜,但是这样答案总是错误,看了别人代码后发现是我位置反了,应该是优先考虑放棋子,再考虑不放等下一个位置放

 1 #include <iostream>
 2 using namespace std;
 3 const int N = 10;
 4 int n,k,ans,col[N];
 5 char mp[N][N];
 6 void dfs(int r,int c,int cnt)
 7 {
 8     if(cnt==k) { ans++;return;}
 9     if(c==n) c=0,r++;
10     if(r==n) return;
11     if(mp[r][c]=='#'&&r<n&&c<n&&!col[c])
12     {
13         col[c]=1;
14         dfs(r+1,0,cnt+1);
15         col[c]=0;
16     }
17     dfs(r,c+1,cnt);
18 }
19 int main()
20 {
21     while(scanf("%d%d",&n,&k)!=EOF&&(n!=-1||k!=-1))
22     {
23         ans = 0;fill(col,col+N,0);
24         for(int i=0;i<n;i++)
25           for(int j=0;j<n;j++)
26             cin>>mp[i][j];
27         dfs(0,0,0);
28         printf("%d\n",ans);
29     }
30     return 0;
31 }
方案1

与八皇后相同的,每一行每一行地搜:

 1 #include <iostream>
 2 using namespace std;
 3 const int N = 10;
 4 int n,k,ans,col[N];
 5 char mp[N][N];
 6 void dfs(int cnt,int r)
 7 {
 8     if(cnt==k) { ans++; return; } 
 9     if(r==n) return;
10     for(int i=0;i<n;i++)
11     {
12         if(mp[r][i]=='#'&&!col[i])
13         {
14             col[i]=1;
15             dfs(cnt+1,r+1);
16             col[i]=0;
17         }
18     }
19     dfs(cnt,r+1);
20 }
21 int main()
22 {
23     while(scanf("%d%d",&n,&k)!=EOF&&(n!=-1||k!=-1))
24     {
25         ans = 0;fill(col,col+N,0);
26         for(int i=0;i<n;i++)
27           for(int j=0;j<n;j++)
28             cin>>mp[i][j];
29         dfs(0,0);
30         printf("%d\n",ans);
31     }
32     return 0;
33 } 
方法2

当我们在该列不放棋子的时候,一定不能直接return回去,而是跳过本行直接看下一行

总结:
       dfs遇到多种选择的代码应是在该函数里写含多个不同选择而导致不同形参的dfs

posted @ 2021-01-08 10:27  acmloser  阅读(58)  评论(0编辑  收藏  举报