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 }

 

 

posted on 2013-08-27 09:48  随风浪子的博客  阅读(121)  评论(0编辑  收藏  举报

导航