问题:
链接:http://codeup.cn/problem.php?cid=100000583&pid=3
AC代码:
(分析已在代码中注释)
//八皇后问题
//先预处理把把皇后所有可能的解从小到大用一个容器vector存下来
//递归回朔
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
vector<string>v;//存最后的解
const int n=8;
int ht[9]={0};int p[9]={0}; //p[i]=j 表示第i行第j列
void generate_p(int idx){ //index代表的是行号
if(idx==n+1){
string s;
for(int i=1;i<=8;++i){
s+=to_string(p[i]);
}
v.push_back(s); //把解存进来
return;
}
for(int x=1;x<=n;++x){//枚举列号
if(ht[x]==0){//可用的列号
int flag=1; //表示在当前列放置皇后是列号不冲突的
for(int pre=1;pre<idx;++pre){//与已经放置的皇后进行两两比较是否有对角线冲突
if(abs(idx-pre)==abs(x-p[pre]))//等腰直角三角形,皇后处于一条对角线
{
flag=false;break;
}
}
if(flag){
p[idx]=x; ht[x]=1;generate_p(idx+1); ht[x]=0;//递归完成,退到上一层,还原x行号为未使用状态---回朔
}
}
}
}
int main(){
generate_p(1);
int m,t;
while(~scanf("%d",&m)){
while(m--){
scanf("%d",&t);
cout<<v[t-1]<<endl;//多组数据,一组数据输入,单个输出
}
}
return 0;
}