POJ 1321 棋盘问题

 1 #include <iostream>
2 #define MAX 10
3 using namespace std;
4 char a[MAX][MAX];
5 int tot , n, k;
6 bool vis[MAX];//用于记录某一列上是否已摆过棋子
7 void dfs(int cur, int num)//深搜开始
8 {

9 if(num == k)
10 {
11 tot ++;//得到一种情况
12 return;

13 }
14 if(cur == n)
15 return;
16 for(int i = 0; i < n; i++)
17 {
18 if(!vis[i] && a[cur][i] == '#')
19 {
20 vis[i] = true;//此列已走过
21 dfs(cur + 1, num +1);//搜索下一行
22 vis[i] = false;//返回的时候一定要记得改回来
23 }

24 }
25 dfs(cur+1, num);//num用于记录已放棋子的个数
26 }

27 int main()
28 {
29 while (cin >> n >>k){
30 if(n == -1) break;
31 tot = 0;
32 for(int i = 0; i < n; i++)
33 for(int j = 0; j < n; j++)
34 cin >> a[i][j];
35 memset(vis, false, sizeof(vis));
36 dfs(0, 0);//从第一行开始,一行一行搜索
37 cout << tot <<endl;

38 }
39 return 0;
40 }
41

这题是我写的第一道dfs的题,比较基础,是八皇后问题的变种,递归的思想浓厚。需要注意的就是退出每层递归的时候要把vis还原。不多说了,看代码。

posted @ 2012-02-23 22:49  背着超人飞  阅读(136)  评论(0)    收藏  举报