由八皇后问题到n皇后的推广

将昨天的程序改用递归的方法实现了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;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值