#include<bits/stdc++.h>
using namespace std;
bool b[100]={0},c[100]={0},d[100]={0};
int a[100],s[93],k=0;//数组s用来保存答案
int search(int);
void print();
int main()
{
int n,j;
cin>>n;
search(1);
for(int i=1;i<=n;i++)//先求出所有解,这样提高效率
{
cin>>j;
cout<<s[j]<<endl;
}
return 0;
}
int search(int i)
{int j;
for(j=1;j<=8;j++)//搜索可以放的八个位置
if((!b[j])&&(!d[i-j+7])&&(!c[i+j]))//判断条件是否成立
{
a[i]=j;//记录列
b[j]=1;//占领列,将占领的列标记为一
d[i-j+7]=1;
c[i+j]=1;//占领两个对角线
if(i==8)print();//如果放置好输出方案
else search(i+1);//摆放下一个皇后
b[j]=0;
d[i-j+7]=0;
c[i+j]=0;//回溯法,收回上一个放出的皇后
}
}
void print()//组成并保存皇后串
{
int i,p=1;
k++;
for(i=8;i>=1;i--)
{
s[k]+=a[i]*p;//从后往前,最后一个数个位,依次为十位,百位,千位。。。
p*=10;
}
}
八皇后问题
于 2018-03-08 15:29:33 首次发布
