题目链接:
代码如下:
#include <bits/stdc++.h>
using namespace std;
int arr[8][8];//存储棋盘
vector<string> v1;//存储结果字符串
vector<int> v2;//存储结果整数
int num=0;//结果总数
bool check(int x,int y){
for(int i=0;i<x;i++){ //检查列冲突
if(arr[i][y]==1){
return false;
}
}
for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--){ //检查左对角线
if(arr[i][j]==1){
return false;
}
}
for(int i=x-1,j=y+1;i>=0&&j<8;i--,j++){ //检查右对角线
if(arr[i][j]==1){
return false;
}
}
return true;
}
void GetStr(){
string str="";
for(int i=0;i<8;i++){ //获取结果序列字符串
for(int j=0;j<8;j++){
if(arr[i][j]==1){
str+=j+1+'0';
}
}
}
int current=0,weight=1;
for(int i=str.size()-1;i>=0;i--){ //将字符串转化为int
int t=str[i]-'0';
t*=weight;
weight*=10;
current+=t;
}
v2.push_back(current);
}
void DFS(int row){
if(row>7){
GetStr();
num++;
return ;
}
for(int col=0;col<8;col++){
if(check(row,col)){
arr[row][col]=1;
DFS(row+1);
arr[row][col]=0;
}
}
}
int main(){
memset(arr,0,sizeof(arr));//初始化
DFS(0);
sort(v2.begin(),v2.end());//按大小排序(升序)
int n;
while(scanf("%d",&n)!=EOF){
printf("%d\n",v2[n-1]);//输出第n个数
}
return 0;
}