HDU ACM 2553 N皇后问题(深搜DFS)

http://acm.hdu.edu.cn/showproblem.php?pid=2553

用暴力的方法 , 二维数组米字型标记

注意:标记恢复时会有重复的标记,所以标记时不能用used[x][y] == 1 要用 used[x][y]++

即使只有1~10,10种数据但是这题输入的数据也非常多  所以要把数据用数组保存起来.

View Code
 1 #include <iostream>
 2 using namespace std;
 3 const int MAX = 10 + 5;
 4 int used[MAX][MAX];
 5 int num;
 6 int q;
 7 void DFS(int n)
 8 {
 9     if(n - q == 1)
10     {
11         num++;
12         return;
13     }
14     int i;
15     int j;
16     int k;
17     for(i=1;i<=q;i++)
18     {
19         if(used[n][i] == 0)
20         {
21             for(j=n;j<=q;j++)
22             {
23                 used[j][i]++;
24             }
25             for(j=1;1;j++)
26             {
27                 if(n+j <= q)
28                 {
29                     if(i+j <= q)
30                     {
31                         used[n+j][i+j]++;
32                     }
33                     if(i-j > 0)
34                     {
35                         used[n+j][i-j]++;
36                     }
37                 }
38                 else
39                 {
40                     break;
41                 }
42             }
43             DFS(n+1);
44             for(j=n;j<=q;j++)
45             {
46                 used[j][i]--;
47             }
48             for(j=1;1;j++)
49             {
50                 if(n+j <= q)
51                 {
52                     if(i+j <= q)
53                     {
54                         used[n+j][i+j]--;
55                     }
56                     if(i-j > 0)
57                     {
58                         used[n+j][i-j]--;
59                     }
60                 }
61                 else
62                 {
63                     break;
64                 }
65             }
66         }
67     }
68     return;
69 }
70 int main()
71 {
72     int mark[11];
73     int i;
74     for(i=1;i<11;i++)
75     {
76         q = i;
77         memset(used,0,sizeof(used));
78         num = 0;
79         DFS(1);
80         mark[i] = num;
81     }
82     while(cin>>q,q)
83     {
84         
85         cout<<mark[q]<<endl;
86     }
87     return 0;
88 }

 

posted @ 2012-08-26 19:55  zx雄  阅读(523)  评论(0编辑  收藏  举报