POJ_1321_棋盘问题(DFS+回溯)
http://poj.org/problem?id=1321
题意:中文的自己看。
1 # include <stdio.h> 2 char map[8][8]; 3 int col[8]; //列的访问状态,0代表这一列没访问过 4 int n,k,c; 5 void DFS(int begin,int num) 6 { 7 int i,j; 8 for(j=0;j<n;j++)//col 9 { 10 //可以放棋子,并且这一列没被访问过。 11 if(map[begin][j] == '#' && col[j]==0) 12 { 13 if(num==1) //放的是最后一个棋子,那么方案数加一。 14 c++; 15 else //如果不是最后一个棋子那么放这一颗棋子,注意他已经满足 16 //可以放并且这一列可以访问的条件了。 17 { 18 col[j]=1; //标记这一行访问过 19 for(i=begin+1;i<=n-num+1;i++)//从下一行开始放num-1个棋子; 20 DFS(i,num-1); 21 col[j]=0; //回溯,找另一种方法继续主函数的循环。 22 } 23 //如果主函数不是循环调用DFS的话,那么这里可以用 24 //DFS(i+1,num);从下一行开始放调。 25 } 26 } 27 } 28 int main() 29 { 30 int i,j; 31 while(scanf("%d%d",&n,&k) != EOF) 32 { 33 getchar(); 34 if(n==-1 && k==-1) 35 break; 36 c=0; 37 for(i=0;i<n;i++) 38 { 39 gets(map[i]); 40 } 41 for(i=0;i<n;i++) 42 col[i]=0; 43 for(i=0;i<=n-k;i++)//从第1行开始放k个到从第n-k行开始放k个,因为你一共放k 44 //个棋子,所以循环是到n-k; 45 { 46 DFS(i,k);//从第i行开始,放k个棋子.按照按行递增的顺序访问,一定不会出现同行 47 } //这是在递归里面常用的方法。 48 printf("%d\n",c); 49 } 50 return 0; 51 }