由八皇后问题到n皇后的推广
2006-07-12 08:39
274 查看
将昨天的程序改用递归的方法实现了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
;
int row
; //控制每一列的循环
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;
}
原来是这样写的:
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
;
int row
; //控制每一列的循环
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;
}
相关文章推荐
- 八皇后问题,Java实现,可推广解决N皇后问题
- 八皇后问题的进化(4)-python写的八皇后
- 八皇后变形之四皇后问题
- 八皇后 n皇后 问题
- 八皇后问题(N皇后问题)
- 从八皇后问题到n皇后问题(leetcode)
- 八皇后问题,C语言实现,求出第一行第一列有皇后的解
- 八皇后乃至n皇后问题
- 八皇后及n皇后问题
- 蓝桥杯练习题 BASIC-27 2n皇后问题(八皇后问题 搜索)
- 八皇后(N皇后)问题算法程序(回溯法)
- 由当时的八皇后而联想到的N皇后的问题
- 八皇后问题、N皇后问题回溯法详解
- 从八皇后问题到2n皇后问题
- 八皇后问题的扩展,任意数量皇后问题的较快速解法
- c++算法之回溯 八皇后延伸 N皇后问题
- 八皇后(N皇后)问题算法程序(回溯法)
- 第1次实验——八皇后及N皇后问题
- 八皇后问题—>n皇后问题
- 递归-八皇后/N皇后问题