题目是一本通1214
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int k,n,cnt,ans[9];
bool usedi[9],usedj[9];
bool Check(int i,int j){
int c=j-i,h=i+j;
for(int a=1;a<=8;a++){
int b=a+c;
if(b<1||b>8||(a==i&&b==j))continue;
if(usedi[a]&&usedj[b])return false;
}
for(int a=1;a<=8;a++){
int b=h-a;
if(b<1||b>8||(a==i&&b==j))continue;
if(usedi[a]&&usedj[b])return false;
}
return true;
}
void Work(int indx){
usedi[indx]=true;
if(indx>8){
cnt++;
return;
}
for(int j=1;j<=8;j++){
if(!usedj[j]&&Check(indx,j)){
usedj[j]=true;
ans[indx]=j;
Work(indx+1);
if(cnt==n){
for(int i=1;i<=8;i++)printf("%d ",ans[i]);
printf("\n");
throw "Finish";
}
usedj[j]=false;
ans[indx]='\0';
}
}
usedi[indx]=false;
return;
}
int main(){
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d",&n);
cnt=0;
memset(usedi,0,sizeof(usedi));
memset(usedj,0,sizeof(usedj));
try{
Work(1);
}
catch(const char* t){
continue;
}
}
return 0;
}