ZY_85 @ 2023-08-25 16:21:18
#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;
// if(b<1||b>8)throw -1;
}
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;
// if(b<1||b>8)throw -1;
}
return true;
}
void Work(int indx){
// for(int k=1;k<=8;k++)printf("%d ",ans[k]);
// printf("\n");
// system("Pause");
usedi[indx]=true;
if(indx>8){
cnt++;
return;
}
for(int j=1;j<=8;j++){
// if(!usedj[j]){
// for(int k=1;k<=8;k++)printf("%d ",ans[k]);
// printf("\n");
// printf("%d %d ",indx,j);
// cout<<Check(indx,j)<<endl;
// system("Pause");
// }
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;
}
by Sirius6699 @ 2023-09-02 09:30:44
你看他的数据: 6≤n≤13。
实在不行也可以......