- 题目描述:
-
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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的皇后串。
- 样例输入:
-
2192
- 样例输出:
-
1586372484136275
1 #include
2 #include 3 #include 4 #include 5 #include 6 #include 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
2 #include 3 #include 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 }