关于八皇后的高效解法

程序代码出自于:http://hi.baidu.com/lauo1988/blog/item/14647d09c01d9787d0581b61.html#comment

由于程序没有注释,我用自己的理解重新注释了下。

代码很简洁如下:

#include"stdio.h"
int i,j,r=0,k,b[8];      // b数组储存8皇后所处列位置 r为解的个数
bool check(int i,int j)
{
if(i==0)                 // 头次调用函数返回
   return true;
else
{
   for(k=i-1;k>=0;k--)       // 由于函数的递归是从棋盘的第一行到尾行 所以只判断第i行之上的各行
    if(j==b[k]||j==b[k]-(i-k)||j==b[k]+(i-k))   // 1.求0 ~ i 行的 j列是否存在皇后
     return false;                              // 2.求右斜方向是否存在皇后 便于思考可将 j == b[k] - (i-k)
   return true;                                 //   改为 j + i == b[k] + k
                                                // 3.求左斜方向是否纯在皇后 j - i == b[k] - k
}                                               // 注:1,2,3分别对应if语句中的判断条件顺序
}

void out(void)
{
     printf("The no.%d answer is:\n",r);
     for(i=0;i<8;i++)
            printf("%2d",b[i]);
            printf("\n");
}

void queen(int i,int j)
{
for(int h=j;h<8;h++)   // 每行列的遍历
{
   if(check(i,h)==1)
   {
    b[i]=h;
    if(i<7)
     queen(i+1,j);   // 由于每行不能存在两个皇后,每找到一个正确位置,往下一行
    else
    {
     r+=1;           // 当满足8皇后 解r+1 
     out();     // 8皇后位置
    }
   }
}
}
int main()
{
queen(0,0);          // 0,0为起点进行递归调用
return 0;
}


ps:如果对if条件判断还存在问题,动手画下矩阵,观察下对角线的规律。相信你会有收获的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值