回溯算法

54 阅读1分钟

回溯算法是一种纯暴力的搜索。
回溯逻辑一般处于递归函数的下方;

他能解决的问题包含以下几种:

  1. 组合问题(组合不强调元素的顺序,类似:set;排列强调顺序)
  2. 切个问题
  3. 子集问题
  4. 排列问题
  5. 棋盘问题(N皇后)

以上这些问题用嵌套循环都是不好解决的,因此要用回溯来解决这些问题

理解回溯

回溯一般都可以抽象为一颗 N 插树;
一般横方向(广度)使用for来遍历,竖方向(深度)使用递归来遍历;

image.png

回溯模板

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}