N皇后问题
1 #include <iostream>
2 using namespace std;
3
4 int map[12][12];
5 int a[12] = {0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680};
6 int n;
7
8 bool check(int ii, int jj)
9 {
10 for(int i = 0; i < n; ++i)
11 if(map[i][jj] || map[ii][i])
12 return false;
13 int k = ii + jj;
14 if(k <= n - 1)
15 {
16 for(int i = 0; i <= k; ++i)
17 if(map[i][k-i])
18 return false;
19 }
20 else
21 {
22 for(int i = k-n+1; i <= n-1; ++i)
23 if(map[i][k-i])
24 return false;
25 }
26 if(ii >= jj)
27 {
28 for(int i = ii - jj, j = 0; i < n; ++i, ++j)
29 if(map[i][j])
30 return false;
31 }
32 else
33 {
34 for(int i = jj - ii, j = 0; i < n; ++i, ++j)
35 if(map[j][i])
36 return false;
37 }
38 return true;
39 }
40 void dfs(int k, int n)
41 {
42 if(k == n)
43 {
44 a[n]++;
45 }
46 for(int i = 0; i < n; ++i)
47 {
48 if(map[k][i] == 0 && check(k, i))
49 {
50 map[k][i] = 1;
51 dfs(k + 1, n);
52 map[k][i] = 0;
53 }
54 }
55 }
56 int main()
57 {
58 /*
59 for(int i = 1; i < 12; ++i)
60 {
61 memset(map, 0, sizeof(map));
62 n = i;
63 a[i] = 0;
64 dfs(0, i);
65 cout << ", " << a[i];
66 }
67 */
68 int k;
69 while(cin >> k && k)
70 cout << a[k] << endl;
71 //getchar();
72 return 0;
73 }
还是too young啊,写了好久。。。

浙公网安备 33010602011771号