回溯算法(决策树遍历)巧解N皇后问题

  废话不多说,解决一个回溯问题,实际上是一个决策树的遍历过程,你只需要思考三个问题:

  1.路径:也就是已经做出的选择。

  2.选择列表:也就是你当前可以做的选择.

  3.结束条件:也就是到达决策树底层,无法再做选择的条件.

下面小戴就拿N皇后问题给大家举例说明:

何为N皇后问题在leetcode网站上第51题有详细的问题描述在这边小戴就把它原题题意摘抄下来如图:

N皇后问题
N皇后问题

题意:大致是皇后所放位置的行列上以及主副对角线上不能放置其他皇后了.然后生成所有可能的解法.

解题思路:穷举出每一行皇后可能放置的位置并且记录下来,当第一行元素选择了皇后放置的位置比如第一行第二列,则记录下来它的位置,后期选择下面行皇后放置的位置的时候应该避免在其主副对角线以及行列上选择,在这里我们可以用hashtable来记录每一行的皇后放置的行列坐标位置,这里有一点特别值得深究,就是如何判断是否在上面行所放置皇后的主副对角线上?前面我们已经提到了用hashtable(哈希表)来存储每一行皇后所放置的坐标,例如key存储皇后所放位置的行坐标value则用来存储列坐标,所以我们可以很简单的判断选择当前行应放置皇后的位置,只需判断当前所放位置的行列坐标是否已经在hashtable(哈希表)中就可以了,如果hashtable存在这个行坐标或者列坐标则代表当前行所选择的皇后所放位置出现在了之前行所选择的皇后所放位置的行或者列上则当前这个位置不能放皇后,如果当前行所选择的放置皇后的位置与hash表中之前行皇后放置的位置的行列坐标相减的绝对值相等的话(行列坐标依次相减)则说明当前行所要选择放置皇后的位置存在在之前行放置皇后位置的主副对角线之上所以不行.当当前行无法选择放置的皇后位置的时候则跳到上一行调整接下来可以放置皇后的位置,再进行递归。结合上面提到的回溯思考的三个问题:路径.选择列表.结束条件。我们就都有了.用哈希表来存储路径也就是存当前行之前行所选择的皇后放置的位置,然后再用哈希表来对当前行所要放置皇后位置做出选择,所以选择列表也有了,最后结束条件就是递归遍历完所有行可以放置皇后位置的所有可能.

下面给出小戴的实现代码(C#):

N皇后问题实现代码

数学大佬高斯穷尽一生都没有数清楚八皇后问题到底有几种可能的放置方法,但是我们的算法只需要一秒就可以算出来所有可能的结果,让我们不得不感叹计算机算法的神奇之处.人生如算法,每一步都是精确的结果.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值