算法学习笔记 之回溯
在阅读《labuladong的算法小抄》,顺便做学习笔记。
回溯算法和二叉树有很密切的关系,解决一个回溯问题,其实也就是对一个决策树进行遍历的过程。
需要关注三个问题:
1 路径:也就是已经做出的选择;
2 选择列表:还可以做出什么选择;
3 结束条件:也就是达到决策树底层,没有再做选择的机会或者必要了;
整体的框架如下:
result = []
def backtrack(路径, 选择列表) :
if 满足结束条件
result.add(路径)
return
for 选择 in 选择列表 :
做选择
backtrack(路径_new,选择列表_new)
撤销选择
其中for循环里的递归式算法的核心,在递归调用之前做选择,在递归调用之后撤销选择。下面就用N皇后问题来带入框架试一下。
依次分析需要关注的三个问题,首先第一点“路劲”,已经走过的路,做过的选择,也就是前面某些个Queen放置的情况;第二点“选择”,也就是要在当前这一行的哪一个位置放置Queen;第三点“结束条件”,也就是什么时候算放完了,当棋盘的每一行都有Queen就认为结束了,棋盘的size是N;
套用框架使用C++来实现:
vector<vector<string>> res;
// 函数签名
vector<vector<string>> SloveNQueen(int n)
{
// 初始化空棋盘 '.'表示空, 'Q'表示皇后
vector<string> board (n, string(n,