#include<iostream.h>
#include<stdlib.h>
const int N=20;
int q[N]; //存放皇后所在的行号
int count=0;//存放解的个数
void Print(int n)
{
count++;
int i;
cout<<"第"<<count<<"个解:";
for(i=1;i<=n;i++)
cout<<"("<<i<<","<<q[i]<<")";
cout<<endl;
}
int Place(int k)//测试第K的q[k]行能否放置皇后
{
int j;
j=1;
while(j<k) //j=1-(k-1)已经放置了皇后的列
{
if((q[j]==q[k])||(abs(q[k]-q[j])==abs(j-k)))
//第j列皇后是否在i行上,位置(q[j],j)和(q[k],k)是否在对角线上
return 0;
j++;
}
return 1;
}
void Queens(int n)//求解八皇后问题
{
int k;
q[1]=0;
k=1; //k是当前列,q[k]是当前行
while(k>0) //对所有的行执行以下语句
{
q[k]=q[k]+1; //移到下一行
while(q[k]<=n&&!Place(k)) //找一个适合的位置
q[k]=q[k]+1;
if(q[k]<=n) //找到了一个合适的位置(q[k],k)
{
if(k==n) //放置了所有的皇后,输出一个解
Print(n);
else
{
k++; //转到下一列
q[k]=0; //从行头开始找
}
}
else
k--; //回溯到上一行
}
}
void main()
{
int n;
n=8;
cout<<"八皇后问题求解如下:";
cout<<endl;
Queens(n);
cout<<endl;
}