九度oj 题目1140:八皇后

题目描述:

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

输入:

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)

输出:

输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。

样例输入:
2
1
92
样例输出:
15863724
84136275

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <string>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <cmath>
 7 #define MAX 10
 8 #define inf 1000000009
 9 int mat[MAX][MAX];
10 int temp[MAX];
11 int ans[100][MAX];
12 int cnt = 0;
13 
14 bool isOk(int x, int y) {
15     int a = 0, b = 0;
16     for(int i = 0; i < 8; i++) {
17         a = a + mat[x][i];
18         b = b + mat[i][y];
19         if(a >= 1 || b >= 1) {
20             return false;
21         }
22     }
23     for(int i = x - 1 , j = y-1; i >=0 && j >= 0; i--, j--) {
24         if(mat[i][j] == 1) {
25             return false;
26         }
27     }
28     for(int i = x - 1 , j = y+1; i >=0 && j < 8; i--, j++) {
29         if(mat[i][j] == 1) {
30             return false;
31         }
32     }
33     return true;
34 }
35 
36 void dfs(int n) {
37     if(n == 8) {
38         cnt++;
39         for(int i = 0; i < 8; i++) {
40             ans[cnt][i] = temp[i];
41         }
42         return;
43     }
44     for(int i = 0; i < 8; i++) {
45         if(isOk(n,i)) {
46             mat[n][i] = 1;
47             temp[n] = i+1;
48             dfs(n+1);
49             mat[n][i] = 0;
50         }
51     }
52 }
53 
54 int main(int argc, char const *argv[])
55 {
56     int n;
57     //freopen("input.txt","r",stdin);
58     memset(mat, 0, sizeof(mat));
59     dfs(0);
60     while(scanf("%d",&n) != EOF) {
61         while(n--) {
62             int m;
63             scanf("%d",&m);
64             for(int i = 0; i < 8; i++) {
65                 printf("%d",ans[m][i]);
66             }
67             puts("");
68         }
69         
70     }
71     return 0;
72 }

 其实,判断是否可以放置的代码还可以利用temp,使其更简洁

 1 #include <cstdio>
 2 #include <string>
 3 #include <cstring>
 4 #define MAX 10
 5 int mat[MAX][MAX];
 6 int temp[MAX];
 7 int ans[100][MAX];
 8 int cnt = 0;
 9 
10 bool isOk(int x, int y) {
11     for(int i = 0; i < x; i++) {
12         if(temp[i]-1 == y) {
13             return false;
14         }
15         if(temp[i]-1+ i == (x+y) || temp[i] -1 - i == (y-x)) {
16             return false;
17         }
18     }
19     return true;
20 }
21 
22 void dfs(int n) {
23     if(n == 8) {
24         cnt++;
25         for(int i = 0; i < 8; i++) {
26             ans[cnt][i] = temp[i];
27         }
28         return;
29     }
30     for(int i = 0; i < 8; i++) {
31         if(isOk(n,i)) {
32             mat[n][i] = 1;
33             temp[n] = i+1;
34             dfs(n+1);
35             mat[n][i] = 0;
36         }
37     }
38 }
39 
40 int main(int argc, char const *argv[])
41 {
42     int n,m;
43     memset(mat, 0, sizeof(mat));
44     dfs(0);
45     while(scanf("%d",&n) != EOF) {
46         while(n--) {
47             scanf("%d",&m);
48             for(int i = 0; i < 8; i++) {
49                 printf("%d",ans[m][i]);
50             }
51             puts("");
52         }
53     }
54     return 0;
55 }
原文地址:https://www.cnblogs.com/jasonJie/p/5738376.html