🧠 Python小练习系列 Vol.6:单词搜索(网格回溯)
🔍 本期我们来挑战一道 LeetCode 上经典的网格型回溯题 —— 单词搜索,考察对 DFS + 状态恢复的掌握!
🧩 一、题目描述
给定一个 m x n 的二维字母网格 board 和一个字符串 word,判断 word 是否存在于网格中。
规则:
- 单词可以从任意一个单元格开始,
- 每次可以向上下左右相邻单元格移动一格,
- 不能重复使用同一个格子。
示例:
board = [
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
word = "ABCCED"
输出:True(存在该路径)
🧠 二、解题思路
采用 回溯 + DFS 的方式:
- 遍历每个格子作为起点;
- 若当前字母匹配,就递归查找上下左右;
- 使用 visited 或直接标记当前格子避免重复访问;
- 若所有字符匹配成功,则返回 True;
- 若不通,则回溯,恢复现场。
👨💻 三、Python代码实现
def exist(board, word):
rows, cols = len(board), len(board[0])
def dfs(x, y, k):
if not (0 <= x < rows and 0 <= y < cols):
return False
if board[x][y] != word[k]:
return False
if k == len(word) - 1:
return True
temp = board[x][y]
board[x][y] = "#" # 标记访问
for dx, dy in [(-1,0), (1,0), (0,-1), (0,1)]:
if dfs(x + dx, y + dy, k + 1):
return True
board[x][y] = temp # 恢复状态
return False
for i in range(rows):
for j in range(cols):
if dfs(i, j, 0):
return True
return False
📌 四、运行示例
board = [
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
print(exist(board, "ABCCED")) # True
print(exist(board, "SEE")) # True
print(exist(board, "ABCB")) # False
🧩 五、解题小结
| 步骤 | 说明 |
|---|---|
| DFS 搜索 | 遇到首字符匹配即深度探索 |
| 标记已访问 | 避免重复走,使用替代标记 “#” |
| 回溯复原 | 走不通要恢复现场,避免干扰下一次探索 |
💡 六、进阶思考
- 🧠 如果要输出路径坐标,如何修改?
- 🚀 如何同时查找多个单词?(提示:使用 Trie)
- 📦 多个路径同时存在时,如何全部找出?
❤️ 结语
这是经典的「网格 + 回溯 + 剪枝」组合题,掌握后能打通很多迷宫类、图遍历类题目思维路径!
📌 下一期预告:全排列生成(回溯算法模板题)
👉 点个赞 👍 + 收藏 🌟,让 DFS 和剪枝在脑中“活”起来!

![[ C语言 ] | 从0到1?](https://i-blog.csdnimg.cn/direct/13d60a32caec4649aefe75c708efe0ca.png)
![[Mac]利用Hexo+Github Pages搭建个人博客](https://i-blog.csdnimg.cn/direct/4cd015aa99d0421f8087b872b9ea6170.png)
















