DFS搜索,从小往大搜自然满足题目的顺序要求
#include <iostream>
#include <cstring>
using namespace std;
int queens[8];
int cnt=0;
bool visit[8];
bool islegal(int index,int i){ //判断新加的皇后会不会被斜着吃掉
for(int k=0;k<index;k++){ //遍历已经排好位置的皇后
if((index-k)==(i-queens[k]) || \ //y=x or y=-x 在斜线上
(index-k)==(queens[k]-i))
return false;
}
return true;
}
void getnth(int n,int index){ //DFS递归函数
if(index==8){ //递归出口
cnt++;
if(cnt==n){
for(int i=0;i<8;i++)
cout<<queens[i]+1;
cout<<endl;
}
return;
}
for(int i=0;i<8;i++){ //假定当前棋子index应该在位置i,引出八个分支并且剪枝
if(visit[i]){ //剪掉新加的皇后被直着吃的分支
continue;
}
if(islegal(index,i)){ //剪掉新加皇后被斜着吃的分支
visit[i]=true;
queens[index]=i;
getnth(n,index+1); //开分支,确定下一个皇后的位置
visit[i]=false;
}
}
}
int main(){
int n;
while(cin>>n){
memset(queens,0,sizeof(queens));
memset(visit,false,sizeof(visit));
cnt=0;
getnth(n,0);
}
}