回溯法与八皇后问题

回溯法与八皇后问题

1. 八皇后问题描述

  会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

2. 解题思路

  每次填满第一行第一列,当不满足时候,试下第一行第二列,依次进行,递归的出口为找到第八个点,跳出递归。,在循环里面还要判断是否满足不同行,不同列,不同对角线。

  使用回溯法来解决该问题,下面的代码是我看到过的最精简的代码,相关的注释都写在代码上了。

#define QUEEN_NUM  8
int c[QUEEN_NUM] = {0};

bool is_ok(int row)
{
    for(int i=0;i<row;i++)
    {
        //判断列和斜对角是否有与之前的皇后冲突。
        if(c[row] == c[i] || abs(c[row]-c[i]) == row-i) return false;
    }
    return true;
}
int queue(int row)
{
    static unsigned char total = 0;  //total为所有八皇后解法的个数
    if(row == QUEEN_NUM)
    {
        total++;
    }else{
       for(int col = 0;col<QUEEN_NUM;col++)
       {
           c[row] = col;
           if(is_ok(row)) //该位置可以放置
           {
               queue(row+1);//放置下一行
           }
       }
    }
    return total;
}

int main()
{
    unsigned char total = queue(0);
    printf("total = %d\n",total);
    return 0;
}

运行得出结果,总共有92中结果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网布道师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值