伪代码:
int m=0,ok=1;//空状态是一个合理情况
int n=8;
do
{
if(ok)
if(m==n)
{
输出解;
调整;
}
else 扩展;
else 调整;
ok=前m个的合理性;
}while(m!=0);
#include <iostream.h>
#define N 8
void main()
{
int n=N-1; //最后行(列)数
int good=1; //合理性
int m=0; //搜索列数
int col[N]; //c[k]表示第c[k]行第k列放置皇后
int a[N]; //a[k]=1表示第k行没有皇后
int b[2*N-1]; //b[k]=1表示第k条反斜线没有皇后
int c[2*N-1]; //c[k]=1表示第k条斜线没有皇后
col[0]=0;
for(int i=0;i<N;i++)
{
a[i]=1;
}
for(i=0;i<2*N-1;i++)
{
b[i]=c[i]=1;
}
do
{
if(good)
{
if(m==n)
{
//output
cout<<"/////////其中一个解答///////////"<<endl;
for(int r=0;r<N;r++)
{
for(int l=0;l<N;l++)
if(col[l]==r)
cout<<" Q ";
else
cout<<" * ";
cout<<"\n";
}
//调整找下一个
while(col[m]==n)
{
m--;
a[col[m]]=b[m+col[m]]=c[m+n-col[m]]=1;
}
col[m]++;
}
else
{
//扩展
a[col[m]]=b[m+col[m]]=c[m+n-col[m]]=0;
col[++m]=1;
}
}
else
{
//调整
while(col[m]==n)
{
m--;
a[col[m]]=b[m+col[m]]=c[m+n-col[m]]=1;
}
col[m]++;
}
good=a[col[m]]&&b[m+col[m]]&&c[m+n-col[m]];//检查合理性
}while(m!=0);
}
#define N 8
void main()
{
int n=N-1; //最后行(列)数
int good=1; //合理性
int m=0; //搜索列数
int col[N]; //c[k]表示第c[k]行第k列放置皇后
int a[N]; //a[k]=1表示第k行没有皇后
int b[2*N-1]; //b[k]=1表示第k条反斜线没有皇后
int c[2*N-1]; //c[k]=1表示第k条斜线没有皇后
col[0]=0;
for(int i=0;i<N;i++)
{
a[i]=1;
}
for(i=0;i<2*N-1;i++)
{
b[i]=c[i]=1;
}
do
{
if(good)
{
if(m==n)
{
//output
cout<<"/////////其中一个解答///////////"<<endl;
for(int r=0;r<N;r++)
{
for(int l=0;l<N;l++)
if(col[l]==r)
cout<<" Q ";
else
cout<<" * ";
cout<<"\n";
}
//调整找下一个
while(col[m]==n)
{
m--;
a[col[m]]=b[m+col[m]]=c[m+n-col[m]]=1;
}
col[m]++;
}
else
{
//扩展
a[col[m]]=b[m+col[m]]=c[m+n-col[m]]=0;
col[++m]=1;
}
}
else
{
//调整
while(col[m]==n)
{
m--;
a[col[m]]=b[m+col[m]]=c[m+n-col[m]]=1;
}
col[m]++;
}
good=a[col[m]]&&b[m+col[m]]&&c[m+n-col[m]];//检查合理性
}while(m!=0);
}