回溯可视化
回溯为递归加上状态恢复规则:作出选择,修改共享状态,向下搜索,返回后按需要撤销改动。递归组织搜索树,撤销让兄弟分支从正确状态开始。
N 皇后占用攻击约束键;全排列把元素交换到固定前缀,再交换回来;数独写入候选数字,检查行、列和宫,子搜索失败后清空该格。
课程比较
| 课程 | 选择 | 剪枝检查 | 需要恢复的状态 | 输出 |
|---|---|---|---|---|
| N 皇后 | 下一行的一列 | 列或对角线键已占用 | 皇后位置和三个约束键 | 第一个有效棋盘 |
| 全排列 | 下一位置的一个剩余元素 | 不同元素的演示不剪枝 | 向前的交换 | 所有位置排列 |
| 数独求解器 | MRV 格子的一个合法数字 | 行、列和 3×3 宫 | 暂填的格子 | 第一个完整解 |
N 皇后和数独是约束搜索。局部赋值违反规则或已无可满足的候选时,可以跳过整棵子树。全排列则遍历每个叶子,重点是恢复:若省略反向交换,后续分支会从错误数组开始。
建议学习顺序
先学 N 皇后。一枚皇后对应三个约束键,放置时占用,撤销时释放。n = 4 的轨迹在第一个解之前必然经历失败分支。
再学全排列。数组本身保存调用状态,同一交换操作既可推进,也可撤销。观察每轮之前调用者的快照:嵌套的反向交换应恢复调用者原状态,无论子树多深。
最后学数独求解器。MRV 选择合法数字最少的空格,约束矩阵解释候选集合。默认演示中,零候选格让递归撤销三次暂填,才能回到正确的根选择。
观察重点
- 找到最小可逆改动:一枚皇后及三个键、一次交换或一个格子。
- 区分拒绝与撤销。被拒绝的候选未进入状态;被撤销的候选曾局部合法,只是在更深处失败,或已完成该分支的枚举。
- 检查循环边界。下一兄弟选择开始前,调用者应看到原状态。
- 检查停止规则。N 皇后和数独返回首个解,全排列记录叶子后继续。
- 区分搜索顺序与有效性。MRV 和从左到右选列改变轨迹及成本,不改变哪些完整赋值有效。
全部回溯可视化课程
进入失败分支,逐步观察高亮代码如何恢复画面中撤掉的状态。