[回溯法]八皇后问题的递归与非递归算法

这篇博客深入探讨了八皇后问题的解决方案,包括递归和非递归算法。通过逐步解释,阐述了如何判断位置合法性,以及如何利用回溯法避免无效的遍历,提高效率。文章提供了详细的代码示例,帮助读者理解和实现这一经典问题。
摘要由CSDN通过智能技术生成

八皇后的问题非常有名,初次理解可能稍有难度,不过多看书,看博客和代码,几遍下来,也基本清晰。

首先不用想初始的情况,先假设前面已经排列好了几个皇后,即将排列下一个皇后。依次遍历八个位置,然后与之前的进行判断这个位置是否可行,如可行则进行下一个皇后,否则则移动位置继续判断。很简单。但是有两个个问题:

1、不全,某个位置有八种方法排列,你只用了一种,当然你可以每个位置遍历,但太耗时,回溯法可以解决很大的一部分问题,即当你在对某一行皇后进行放置时,如果一直放不好(到最后),那后面的行就不需要再遍历了,直接回溯上一行,将上一行的位置后移——依次进行这个步骤,直到第一行,遍历结束。
2、如何判定当前位置合法?首先,两个皇后不能同一列(这里要注意,算法的遍历次序是按行来的,所以不必考虑行的情况),其次,不能斜对角。
代码如下,很清晰:

#define N 8
/*
    Place(),第一个参数表示八皇后的列位置,第二个表示当前要插入的八皇后的行数。
*/
bool Place(int eightqueen[],int k)
{
    
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值