会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。 给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
输入描述:
每组测试数据占1行,包括一个正整数b(1 <= b <= 92)
输出描述:
输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。
示例1
输入
1
输出
15863724
//考点:象棋,八皇后;知识点:递归
//S(n) = O(n!),递归
//思路:定义二维数组为92种解法的存储位置,根据题意选择适当的解
//步骤:1.初始化全局变量a[95][10],c[10],total置0;深度优先遍历棋盘,定义函数dfs(cur),cur表示从cur行开始检测通路
//2.0~7进行i循环,根据题意选择其实行对应的解——8位整数串
//3.详细dfs定义:如果cur为8,则total+1,0~7遍历a[total][i]=c[i]
//4.否则0~7循环,c[cur]接收索引i,初始ok为1,内层循环j从0~cur - 1,ok置0并退出内层循环的条件是c[j] == i 或cur - i == j - c[j]或cur + i ==c[j] + j。
//5.内层循环结束后如果ok那递归调用dfs(cur + 1)
#include<bits/stdc++.h>
using namespace std;
int a[95][10];//解
int c[10];
int total = 0;
//深度优先遍历
void dfs(int cur){//起始位置
if(cur == 8){
total++;
for(int i = 0; i < 8; i++){
a[total][i] = c[i];
}
}else{
for(int i = 0; i < 8; i++){
c[cur] = i;//标记位置,遍历对应行所有列
int ok = 1;//默认是所求的解
for(int j = 0; j < cur; j++){//与本行前面选择过的数字比较,如果行、列、对角线都不在一条直线上,则递归下一行
if(c[j] == i || cur - i == j - c[j] || cur + i == c[j] + j){//第一个条件比较的是在不在同一列,后面两个条件分别比较正对角线和负对角线在不在同一直线上
ok = 0;
break;//此方案行不通啊
}
}
if(ok){//i循环中此路可行
dfs(cur + 1);//检测下一行
}
}
}
}
int main(){
int N;
while(scanf("%d", &N) != EOF){
dfs(0);//从索引号0开始逐行检测是否有通路
for(int i = 0; i < 8; i++){//8皇后
printf("%d", a[N][i] + 1);//根据需要取方案
}
//cout<<endl;
printf("\n");
}
return 0;
}