回溯的本质是穷举
- 把要穷举的问题抽象为树形结构
- 横向遍历(遍历遍及一维数组内所有数据)
- 纵向遍历(纵向深度由递归深度控制)
- 穷举模板
- 枚举剪枝
- 数据的共享和重复使用
- “树枝剪枝”
- “树层剪枝”
- 组合问题(有无重复数据)、分割问题(按顺序分割)
回溯函数模板
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
棋盘问题
- 模拟棋盘生成一个二维列表,方便定位棋盘的坐标,x–y
- 最后得出结果时二维列表中的一维列表再转换为其它对应的格式存储