回溯——n皇后问题

来源:互联网 发布:美工设计要求 编辑:程序博客网 时间:2024/06/16 05:00

思想:

用回溯方法求解,首先要分析问题的求解空间。可用一棵n叉树表示这个问题的求解空间,在回溯遍历这个课二叉树的过程中形成合理的解。

对于这棵n叉树,列序号i(0~n-1)是它的孩子,而每个孩子都有深度为n的子树(包括自身),这些子树的层次是n个皇后(也代表每个皇后的行序号,因为不同的皇后肯定不在同一行)。于是,遍历这个n叉树的每个孩子结点到叶子节点便得到一个合理解。遍历时,先从第一个孩子(第一行)开始遍历,深度遍历这个孩子子树,直到找到(1)一个合理解或者(2)剪去不存在合理解的分枝。对于(1)表明已经遍历到了叶子节点,亦即所有的皇后都找到了一个合理的位置,对于(2)表明在某个层次的皇后节点不能找到一个合理位置,于是停止深度遍历,将此分枝剪去。不管对于哪种情况,此时要向上层回溯,继续探索合理的解。直到整个n叉树都遍历完。

比如对于4个皇后的情况,首先让第一个皇后占据x[0][0](第一行第一列),然后让第二个皇后在第二行寻找合适的位置x[1][2](第二行,第3列),第三个皇后在第三行寻找合适的位置,此时第三个皇后已经不能找到合适位置,于是将此分枝剪去。回溯到第二个皇后(第二行),探索新的位置,此时对于第二个皇后已经不能找到合理位置。回溯到第一个皇后(第一行),探索新的位置。此时,让第一个皇后占据第一行第二列x[0][1],依次回溯,直到第一个皇后的所有列都试探完毕,也就遍历完了n叉树。

下面给出递归和非递归的实现:

原创粉丝点击