将昨天的程序改用递归的方法实现了n皇后,但后来发现昨天的程序虽然可以求解,但无法求出全部解,8皇后的所有解应为92个,但我只求出了61个。经过n个小时的艰苦调试,终于发现问题所在,原来是在check函数中,后面两个for循环使用了两个条件判断,我误以为两个之间是与关系,原来是或关系。
原来是这样写的:
int rrr1,hhh1;
for(rrr1=r-1,hhh1=h-1;rrr1>=0,hhh1>=0;rrr1--,hhh1--)//左上斜线
{
if(arr[rrr1][hhh1]==1)
return false;
}
改成这样就可以了:
int rrr1,hhh1;
for(rrr1=r-1,hhh1=h-1;(rrr1>=0)&(hhh1>=0);rrr1--,hhh1--)//左上斜线
{
if(arr[rrr1][hhh1]==1)
return false;
}
改写后的n皇后程序:
#define N 8 //皇后的个数
#include <iostream.h>
#include <memory.h>
int count=0; //解的个数
int dno=0;
//棋盘
int arr[N][N];
int row[N]; //控制每一列的循环
bool check(int r,int h)
{
if(h>0)
{
int hh;
for(hh=h-1;hh>=0;hh--)//检查之前的每一列
{
if(arr[r][hh]==1)
return false;
}
}
if((h>0)&(r>0))
{
c
}
if((h>0)&(r<N-1))
{
int rrr2,hhh2;
for(rrr2=r+1,hhh2=h-1;(rrr2<=N-1)&(hhh2>=0);rrr2++,hhh2--)//左下斜线
{
if(arr[rrr2][hhh2]==1)
return false;
}
}
return true;
}
void display()
{
//显示棋盘
int i;
for(i=0;i<N;i++)
{
int j;
for(j=0;j<N;j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
}
void next()
{
for(row[dno]=0;row[dno]<N;row[dno]++)
{
if(check(row[dno],dno))
{
arr[row[dno]][dno]=1;
if(dno>=N-1)//已求解
{
count++;
display();
cout<<endl;
}
else
{
dno++;
next();
}
arr[row[dno]][dno]=0;
}
}
dno--;
}
int main()
{
memset(arr,0,sizeof(arr));
memset(row,0,sizeof(row));
next();
cout<<count<<"种结果"<<endl;
return 0;
}