题目描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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的皇后串。
样例输入
3 6 4 25
样例输出
25713864 17582463 36824175
#include<bits/stdc++.h>
using namespace std;
vector<string>mp;
bool graph[10][10];
string tmp;
bool check(int x,int y){
//检查横,竖
for(int i=1;i<=8;++i){
if(graph[x][i]) return false;
if(graph[i][y]) return false;
}
//左上
int i=x,j=y;
while(i>0&&j>0){
if(graph[i][j]) return false;
i--,j--;
}
//右下
i=x,j=y;
while(i<=8&&j<=8){
if(graph[i][j]) return false;
i++,j++;
}
//左下
i=x,j=y;
while(i<=8&&j>0){
if(graph[i][j]) return false;
i++,j--;
}
//左上
i=x,j=y;
while(i>0&&j<=8){
if(graph[i][j]) return false;
i--,j++;
}
return true;
}
void dfs(int x,int y){
if(x==8){
mp.push_back(tmp);
return;
}
for(int j=1;j<=8;j++){
if(check(x+1,j)){
string t=tmp;
graph[x+1][j]=1;
tmp+=(j+'0');
dfs(x+1,j);
tmp=t;
graph[x+1][j]=0;
}
}
}
void init(){
for(int i=1;i<=8;++i) {
tmp="";
graph[1][i]=1;
tmp+=(i+'0');
dfs(1,i);
graph[1][i]=0;
}
sort(mp.begin(),mp.end());
}
int main(){
int t,n;
ios::sync_with_stdio(0);
init();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
cout<<mp[n-1]<<endl;
}
return 0;
}