poj 1321 棋盘问题 简单DFS
题目链接:http://poj.org/problem?id=1321
很久没有敲搜索了啊,今天敲了个水题练练手,哈哈。。。。
题目大意: 就是求在n*n的方格上放置k个棋子的方案数
代码:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 int n,k; 7 char map[10][10]; 8 int visit[10]; 9 int sum; 10 int ans; 11 bool Jude(int k,int num) 12 { 13 int i; 14 if(k==-1) return 1; 15 if(map[num][k]=='.') return 0; 16 for(i=0;i<num;i++) 17 if(k==visit[i]) break; 18 if(i== num ) { visit[num]=k; sum++; return 1;} 19 else return 0; 20 } 21 void dfs(int row) 22 { 23 if(sum==k) {ans++;return ;} 24 if(row ==n && sum<k) return ; 25 int i=-1; 26 while(i<n) 27 { 28 if(Jude(i,row)) 29 { 30 dfs(row+1); 31 if(i>=0) { visit[row]=-1;sum--;} 32 } 33 i++; 34 } 35 } 36 int main() 37 { 38 while(scanf("%d%d",&n,&k)!=EOF) 39 { 40 if(n==-1 && k==-1) break; 41 for(int i=0;i<n;i++) scanf("%s",map[i]); 42 43 memset(visit,-1,sizeof(visit)); 44 sum=0; 45 ans=0; 46 int i=-1; 47 while(i<n) 48 { 49 if(Jude(i,0)) 50 { 51 dfs(1); 52 if(i>=0) { visit[0]=-1;sum--;} 53 } 54 i++; 55 } 56 cout<<ans<<endl; 57 58 } 59 return 0; 60 }