主要难点是判断数组元素位置是否符合皇后放置规定。
判断某个数组元素是否符合要求时应该注意判断一下6个方面:
该元素的同行;
该元素的同列;
该元素的左下;
该元素的右下;
该元素的左上;
该元素的右上;
该方法如下:
bool guarded(int c[][8],int a,int b)//判断位置是否符合要求
{
int i;
for(i=0;i<8;i++)//判断同列
{
if(c[a][i]==1)
return false;
}
for(i=0;i<8;i++)//判断同行
{
if(c[i][b]==1)
return false;
}
for(i=0;(a-i>=0)&&(b+i<8);i++)//判断左下方元素
{
if(c[a-i][b+i]==1)
return false;
}
for(i=0;(a+i<8)&&(b+i<8);i++)//判断右下方元素
{
if(c[a+i][b+i]==1)
return false;
}
for(i=0;(a+i<8)&&(b-i>=0);i++)//判断右上方元素
{
if(c[a+i][b-i]==1)
return false;
}
for(i=0;(a-i>=0)&&(b-i>=0);i++)//判断左上方元素
{
if(c[a-i][b-i]==1)
return false;
}
return true;
}
该算法如下:
#include<iostream.h>
bool guarded(int c[][8],int a,int b)//判断位置是否符合要求
{
int i;
for(i=0;i<8;i++)//判断同列
{
if(c[a][i]==1)
return false;
}
for(i=0;i<8;i++)//判断同行
{
if(c[i][b]==1)
return false;
}
for(i=0;(a-i>=0)&&(b+i<8);i++)//判断左下方元素
{
if(c[a-i][b+i]==1)
return false;
}
for(i=0;(a+i<8)&&(b+i<8);i++)//判断右下方元素
{
if(c[a+i][b+i]==1)
return false;
}
for(i=0;(a+i<8)&&(b-i>=0);i++)//判断右上方元素
{
if(c[a+i][b-i]==1)
return false;
}
for(i=0;(a-i>=0)&&(b-i>=0);i++)//判断左上方元素
{
if(c[a-i][b-i]==1)
return false;
}
return true;
}
void start(int a[][8])
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
a[i][j]=0;
}
}
}
void printf(int a[][8])//打印输出数组
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
//bool nidaye()
//{return true;}
//void panduan(int a[][8])
//{
// int i,j;
// for(i=0;i<8;i++)
// {
// for(j=0;j<8;j++)
// {
/// cout<<guarded(a,i,j)<<" ";
// }
// cout<<endl;
// }
//}
int sum1(int a[][8])//判断皇后数量
{
int sum=0;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(a[i][j]==1)
sum=sum+1;
}
}
return sum;
}
void main()
{
int a[8][8];
start(a);
for(int k=0;k<8;k++)
{
for(int l=0;l<8;l++)
{
a[k][l]=1;//每次置为一的元素不同
for(int i=0;i<8;i++)//循环判断每个元素位置是否符合要求
{
for(int j=0;j<8;j++)
{
if(guarded(a,i,j))
{
a[i][j]=1;
}
}
}
if(sum1(a)==8)//判断皇后有8个时
{printf(a);}
start(a);//注意每次循环将数组初始化
}
}
}