- 题目描述:
-
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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 }