題目網址
#include<iostream>
using namespace std;
int P[1000][9];//方式i中第j行皇后的列位置为P[i][j]
int tmp[8];//当前方式中第i行皇后的列位置为tmp[i]
int n=0;//方式数初始化
bool col[8]={0},leftt[15]={0},rightt[15]={0};//所有列和左右对角线未被选中
void func(int r)//从r行出发,递归计算所有方案中8个皇后的位置
{
if(r==8)//若搜索了所有行
{
for(int i=0;i<8;i++)//记下当前方式中8个皇后的列位置
P[n][i]=tmp[i];
n++;//方式数+1
return ;//回溯
}
for(int c=0;c<8;c++)//依次搜索r行的每一列
{
int ld=(c-r)+7;//计算(r,c)的左右对角线
int rd=c+r;
if(!col[c]&&!leftt[ld]&&!rightt[rd])//若第c列和左右对角线未选中,
//则选中c列和左右对角线
{
col[c]=1,leftt[ld]=1,rightt[rd]=1;
tmp[r]=c;//(r,c)放置皇后
func(r+1);//递归下一行
col[c]=0,leftt[ld]=0,rightt[rd]=0;//撤去第c列和左右对角线的选中标志
}
}
}
int main()
{
func(0);
int t;cin>>t;cout<<endl;
while(t--)
{
int x,y,time=1;
cin>>x>>y;
cout<<"SOLN COLUMN"<<endl;
cout<<"# 1 2 3 4 5 6 7 8"<<endl<<endl;
for(int i=0;i<n;i++)
{
if(P[i][x-1]==y-1)
{
cout<<time++<<" ";
for(int j=0;j<8;j++)
{
cout<<P[i][j]+1;
if(j!=7) cout<<" ";
}
cout<<endl;
}
}
cout<<endl;
}
return 0;
}