第7章|回溯与搜索

Unit 08 · LeetCode #79 · 优化版

← Unit 07
79
Word SearchGrid DFS · Visit · Restore

路径从线性区间,
扩展到二维网格的四邻域。

进入 dfs(row,col,index) 时,当前位置尝试匹配 word[index]。匹配后临时占用格子,只向上下左右扩展;无论分支成功或失败,返回调用者前都要恢复该格子。

LeetCode #79 题目模型四邻接路径,同一坐标在一条路径中只能使用一次

题目要求

给定字符网格 board 和字符串 word,判断能否从某个格子开始,通过水平或垂直相邻格子依次构造出该单词。

class Solution: def exist(self, board: List[List[str]], word: str) -> bool: pass

主实验

  • 网格为官方示例;
  • 主路径构造 ABCCED;
  • 恢复实验使用 SEE 的失败起点。

状态契约

state = (row, col, index) candidate = four neighbors path chars = word[:index+1]
current cell matches word[index] coordinates are unique in current path restore before return

章节联系

Unit 07 的下一状态只有 end+1;本题每个状态最多产生四个空间后继,因此必须新增“路径内占用”状态。

Spatial State

递归状态由二维坐标和单词下标共同定义,候选来自当前格子的四邻域。

Character Alignment

一个坐标只有在字符等于当前目标字符时,才会被标记并进入更深递归。

Path-Local Visit

占用只属于当前调用链;失败分支访问过的格子不能永久封锁其他路径。

Restore on Return

先保存原字符,再临时标记;递归结束后恢复,保持父调用看到的网格不变。

1. 二维四邻接
2. 字符与占用过滤
3. 失败后恢复
4. 路径占用反例
5. 槽位+真实轨迹
6. 迁移 #212
已恢复上次学习位置、代码槽位和运行轨迹。
board · word="ABCCED"四邻接,不允许重复坐标

目标单词进度

当前坐标路径

当前四邻居

路径内占用

当前搜索链

为什么当前动作安全

当前递归契约

搜索事件

当前坐标
word index
下一字符
路径长度
候选范围上下左右
完成条件index == len(word)

路径不变量

恢复不变量

已匹配字符
当前路径长度
已占用格子
有效下一步
状态一致
1. 完整演示
2. 功能提示槽位
3. 关键代码补全
4. 独立完成
关键槽位补全先选语义槽位 → 再选代码
待填槽位|只提示作用
待选代码|顺序随机
实时拼接后的代码骨架0 / 6

当前认知焦点1 / 1
真实 DFS 调用树
代码 × 状态逐行联动board / visited / current 同步

状态依赖问题|不阻塞逐行运行

成功的 goal 子调用已经返回 True,但当前父帧的格子仍被临时标记为 #。父帧真正 return found 之前必须先做什么?

独立完成:关闭上方脚手架后,只保留完整编辑器。
#79 独立完成

迁移题:LeetCode #212 单词搜索 II

空间 DFS 的四邻接、路径内占用与恢复保持不变;固定 word[index] 改为 Trie 当前节点的允许后继字符。前缀不在 Trie 中时立即结束该调用。

Unit 08 完成

二维网格回溯的核心是:用坐标和匹配进度定义状态,只扩展四邻居;把格子占用限制在当前调用链,并在函数返回前恢复,从而保证不同起点和兄弟分支互不污染。

题型#79|二维路径匹配
状态row、col、index、路径占用
候选上下左右四邻居
过滤越界、字符不匹配、当前路径已占用
选择临时标记当前格子
完成index == len(word)
恢复返回前还原原字符
作用域visited 属于当前路径,不是全局永久状态
迁移#212:Trie 前缀节点替代固定 word index