棋盘问题 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
标签:cnt,1321,return,int,dfs,POJ,mp,ans,棋盘 来源: https://www.cnblogs.com/newblg/p/14250213.html