HDU 2553(N皇后)(DFS)

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

i表示行,map[i]表示列,然后用DFS遍历回溯

可以参考这篇文章:

http://blog.csdn.net/cambridgeacm/article/details/7703739

 1 #include <iostream>
 2 #include <string>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <stack>
 9 using namespace std;
10 
11 #define MEM(a,b) memset(a,b,sizeof(a))
12 
13 bool used[15];
14 //i表示行,map[i]表示列
15 int map[15];
16 int sol[15];
17 
18 int ans,n;
19 
20 
21 void dfs(int k)
22 {
23           int i,j;
24 
25           //判断末尾
26           if(k==n+1)
27           {
28                     ans++;
29                     return;
30           }
31 
32           for(i = 1;i<=n;i++)
33           {
34                     if(!used[i])
35                     {
36                               map[k] = i;
37                               bool flag = true;
38 
39                               //是否在一条斜线上
40                               for(j=1;j<=k-1;j++)
41                               {
42                                         if((map[k]-map[j])==(k-j) || (map[k]-map[j])==(j-k))
43                                         {
44                                                  flag = false;
45                                                  break;
46                                         }
47                               }
48                               if(flag)
49                               {
50                                         used[i] = true;
51                                         dfs(k+1);
52                                         //没找到,释放used
53                                         //回溯
54                                         used[i] = false;
55                               }
56                     }
57           }
58 }
59 
60 
61 int main()
62 {
63           int t,i;
64           //保存是因为后台可能有重复的数据,单次来说效率是一样的
65           for(i = 1;i<=10;i++)
66           {
67                     MEM(used,false);
68         MEM(map,0);
69         n = i;
70         ans = 0;
71         dfs(1);
72         sol[i] = ans;
73           }
74 
75     while (~scanf("%d",&n) && n)
76     {
77                     printf("%d
",sol[n]);
78     }
79     return 0;
80 }
原文地址:https://www.cnblogs.com/qlky/p/5020872.html