首页 > 代码库 > POJ 1321

POJ 1321

一个比较基础的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 }

 

POJ 1321