回溯算法详解(转)

Posted vincentbnu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯算法详解(转)相关的知识,希望对你有一定的参考价值。

https://leetcode-cn.com/problems/n-queens/solution/hui-su-suan-fa-xiang-jie-by-labuladong/

 

这篇文章是很久之前的一篇《回溯算法详解》的进阶版,之前那篇不够清楚,就不必看了,看这篇就行。把框架给你讲清楚,你会发现回溯算法问题都是一个套路。

废话不多说,直接上回溯算法框架。解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:

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

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

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

如果你不理解这三个词语的解释,没关系,我们后面会用「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你理解这些词语是什么意思,现在你先留着印象。

代码方面,回溯算法的框架:

result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return

for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择

其核心就是 for 循环里面的递归,在递归调用之前「做选择」,在递归调用之后「撤销选择」,特别简单。

什么叫做选择和撤销选择呢,这个框架的底层原理是什么呢?下面我们就通过「全排列」这个问题来解开之前的疑惑,详细探究一下其中的奥妙!

 

以上是关于回溯算法详解(转)的主要内容,如果未能解决你的问题,请参考以下文章

回溯法实例详解(转)

回溯算法详解(修订版)

回溯算法详解[力扣46:全排列]

LeetCode回溯算法#07子集问题I+II,巩固解题模板并详解回溯算法中的去重问题

八皇后问题算法详解

[转]五大常用算法:分治动态规划贪心回溯和分支界定