您的位置:首页 > 其它

POJ 1321 棋盘问题(棋盘DFS)

2013-12-17 14:12 274 查看
棋盘问题

思路:

分层查找,逐行深搜。

注意k < n时的处理。







1 #include <map>
 2 #include <stack>
 3 #include <queue>
 4 #include <math.h>
 5 #include <stdio.h>
 6 #include <string.h>
 7 #include <iostream>
 8 #include <limits.h>
 9 #include <algorithm>
10 #define LL long long
11 #define min(a,b) (a>b?b:a)
12 #define max(a,b) (a>b?a:b)
13 #define eps 1e-9
14 #define INF 1 << 30
15 using namespace std;
16 
17 int Ans;
18 int n, m;
19 char Map[10][10];
20 int vis[10];
21 
22 void DFS(int x, int num)
23 {
24     if(num == n)
25     {
26         Ans++;
27         return ;
28     }
29     if(x > n)
30     return ;
31     for(int i = 0; i < m; i++)
32     {
33         if(Map[x][i] == '#' && !vis[i])
34         {
35             vis[i] = 1;
36             DFS(x+1, num+1);
37             vis[i] = 0;
38         }
39     }
40     DFS(x+1, num);    //这里是难点,当k<n时,x在等于n之前就可能已经把全部棋子放好  
41                       //又由于当全部棋子都放好后的某个棋盘状态已经在前面循环时记录了  
42                       //因此为了处理多余行,令当前位置先不放棋子,搜索在下一行放棋子的情况 
43     return ;
44 }
45 
46 void run()
47 {
48     while(~scanf("%d%d%*c", &m, &n))
49     {
50         if(m == -1 && n == -1)
51             break;
52         memset(Map, 0, sizeof(Map));
53         memset(vis, 0, sizeof(vis));
54         for(int i = 0; i < m; i++)
55         {
56             for(int j = 0; j < m; j++)
57                 scanf("%c", &Map[i][j]);
58             getchar();
59         }
60         Ans = 0;
61         DFS(0, 0);
62         printf("%d\n", Ans);
63     }
64 }
65 
66 int main(void)
67 {
68     run();
69 
70     return 0;
71 }


棋盘问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: