//a[i]=n,i表示数组的列,n则表示皇后所在列的位置
#include
#define Queens 8 //定义结果数组的大小,也就是皇后的数目
int a[Queens+1]; //八皇后问题的皇后所在的行列位置,从1开始算起,所以加1
int main()
{
int i, k, flag, not_finish=1, count=0;
//正在处理的元素下标,表示前i-1个元素已符合要求,正在处理第i个元素
i=1;
a[1]=1; //为数组的第一个元素赋初值
printf("The possible configuration of 8 queens are:\n");
while(not_finish)
{ //not_finish=l:处理尚未结束
while(not_finish && i<=Queens)
{ //处理尚未结束且还没处理到第Queens个元素
for(flag=1,k=1; flag && k//判断是否有多个皇后在同一行
{
if(a[k]==a[i])
{
flag=0;
}
}
for (k=1; flag&&k//判断是否有多个皇后在同一对角线
{
if( (a[i]==a[k]-(k-i)) || (a[i]==a[k]+(k-i)) )
{
flag=0;
}
}
if(!flag)
{ //若存在矛盾不满足要求,需要重新设置第i个元素
if(a[i]==a[i-1])
{ //若a[i]的值已经经过一圈追上a[i-1]的值
i--; //退回一步,重新试探处理前一个元素
if(i>1 && a[i]==Queens)
{
a[i]=1; //当a[i]为Queens时将a[i]的值置1
}
else
{
if(i==1 && a[i]==Queens)
{
not_finish=0; //当第一位的值达到Queens时结束
}
else
{
a[i]++; //将a[il的值取下一个值
}
}
}
else if(a[i] == Queens)
{
a[i]=1;
}
else
{
a[i]++; //将a[i]的值取下一个值
}
}
else if(++i<=Queens)
{
if(a[i-1] == Queens )
{
a[i]=1; //若前一个元素的值为Queens则a[i]=l
}
else
{
a[i] = a[i-1]+1; //否则元素的值为前一个元素的下一个值
}
}
}
if(not_finish)
{
++count;
printf((count-1)%3 ? "\t[%2d]:" : "\n[%2d]:", count);
for(k=1; k<=Queens; k++)
{//输出结果
printf(" %d", a[k]);
}
if(a[Queens-1]1]++; //修改倒数第二位的值
}
else
{
a[Queens-1]=1;
}
i=Queens -1; //开始寻找下一个满足条件的解
}
}
}
这一段代码的作用,不是很明白
if(a[Queens-1]
{
a[Queens-1]++; //修改倒数第二位的值
}
else
{
a[Queens-1]=1;
}
那。。。直接提供源代码呢(有一小部分的批注哈)
是这道吗:http://ybt.ssoier.cn:8088/show_source.php?runid=7292783
#include<bits/stdc++.h>
using namespace std;
int a[10001],b[10001],m[10001],w[10001],tot=0;
int print()
{
tot++;
cout<<"No. "<<tot<<endl;
for(int j=1;j<=8;++j)
{
for(int i=1;i<=8;++i)
if(j==a[i])
cout<<1<<" ";
else
cout<<0<<" ";
cout<<endl;
}
}
int search(int j)
{
for(int i=1;i<=8;++i)
{
if(b[i]==0&&w[i-j+7]==0&&m[i+j]==0)
{
a[j]=i;
b[i]=1;
w[i-j+7]=1;
m[i+j]=1;
if(j==8)
print();
else
search(j+1);
b[i]=0;
w[i-j+7]=0;
m[i+j]=0;
}
}
}
int main()
{
search(1);
return 0;
}
请看👉 :八皇后问题详解