我是靠谱客的博主 简单小鸽子,最近开发中收集的这篇文章主要介绍回溯算法(决策树遍历)巧解N皇后问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

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

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

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

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

N皇后问题
N皇后问题

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

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

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

N皇后问题实现代码

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

最后

以上就是简单小鸽子为你收集整理的回溯算法(决策树遍历)巧解N皇后问题的全部内容,希望文章能够帮你解决回溯算法(决策树遍历)巧解N皇后问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部