八皇后问题


在一个8 x 8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现相互攻击的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。

  解题思路:
         1. 建立一个N x N(!N皇后问题都适用:))棋盘,用 1 代表皇后,0 代表空格,2 代表边界。
         2.检查是否出现攻击,若没有出现攻击则放置皇后,继续下一行寻找(递归)。
         3.若出现攻击则继续下一个位置的检测,若该行没有合适的位置则将上一行放置的皇后撤回,继续上一行寻找(回溯)。
举例说明如下:


       
  若按上图放置则会发现第六行没有满足条件的位置,因此需要撤销第五行的放置继续向后寻找第五行应放的位置。


  程序实现:
         由解题思路可以看出实现该算法所需要的函数即为棋盘生成函数检查函数放置皇后函数,同时还需要显示函数进行结果观察。
检查函数代码如下(c语言):

int check1(int i, int j)
{
     
     if(a[i][j] == 1)
       {
              return 0;  
       } 
      if(a[i][j] ==  2) 
      {
         return 1;         
      }    
      if(a[i][j] == 0)
      {
          return check1(i-1,j-1);
      }
}

放置皇后函数代码如下:

void find(int i)
{
  int j;
   if(i > 8)
   {
      count++;
      display();     
   }
   else
   {
       for(j = 1; j < 9; j++)
       {
          
          
           if(check1(i,j)&& check2(i,j)&&check3(i,j))
           {
               a[i][j] = 1;
               find(i+1); 
               a[i][j] = 0;                                        
           }       
       }
  }       
}
其中check1(i,j)为检查左对角线(上述给出),check2(i,j)和check3(i,j)则分别为检查右对角线与同列元素(与check1(i,j)相似)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值