#include<stdio.h>
#include<iostream>
#include<cmath>
using namespace std;
//用一维数组存储,解决行冲突,数组下标为行数,数组值为列数
int x[10]={0};
int count=0;
bool judge(int k)//判断第k行某个皇后是否发生冲突 ,发生冲突就跳过
{
int i=1;
while(i<k) //循环i到k-1之前的皇后;
{
if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k))//存在列冲突或者存在对角线冲突(实际上就是一种剪枝)
return false;
i++;
}
return true;
}
void queen(int n)
{
int i,k=1; //k为当前行号,从第一行开始
x[1]=0;//x[k]为第k行皇后所放的列号
while(k>0)
{
x[k]++; //首先从第一列开始判断
while(x[k]<=n&&!judge(k))//推导k行到底选择哪一列,如果当前该列不行则下一列,直到成立即可;
x[k]++;
if(x[k]<=n)
{
if(k==n)//输出所有解
{
for(i=1;i<=n;i++)
//printf("第%d行的皇后:在第%d列 ",i,x[i]);
printf("%d ",x[i]);
count++;
//printf("-------这是其中第%d个解",count);
printf("\n");
}
else//判断下一行
{
k++; x[k]=0;
}
}
else k--;//没找到,回溯
}
cout<<n<<"皇后问题有"<<count<<"个不同的解";
return ;
}
int main()
{
int n;
cout<<"请输入你的n皇后:";
cin>>n;//n最大值不超过10
cout<<n<<"皇后问题的解为"<<endl;
queen(n);
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容