一个比较基础的dfs,看了某位仁兄的代码,思路非常有趣,直接认准一行进行dfs就可以了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 char pan[10][10]; 7 int n,k; 8 int sum; 9 bool p[10];//标记已经放下的一列 10 int cnt; 11 12 bool judge(int x,int y)//判断是否可以放下 13 { 14 if(pan[x][y]==‘#‘&&p[y]==false)return true; 15 else return false; 16 } 17 18 void dfs(int x)//认准一行dfs 19 { 20 if(sum==k) 21 { 22 cnt++; 23 return; 24 } 25 if(x>=n) 26 return; 27 for(int i=0;i<n;i++) 28 { 29 if(judge(x,i)) 30 { 31 p[i]=true; 32 sum++; 33 dfs(x+1); 34 p[i]=false; 35 sum--; 36 } 37 } 38 dfs(x+1); 39 } 40 41 int main() 42 { 43 while(scanf("%d%d",&n,&k)&&n!=-1) 44 { 45 sum=0; 46 cnt=0; 47 for(int i=0;i<n;i++) 48 for(int j=0;j<n;j++) 49 cin>>pan[i][j]; 50 dfs(0); 51 cout<<cnt<<endl; 52 } 53 return 0; 54 }
原文:http://www.cnblogs.com/acceped/p/6697041.html