BFS 求网格最短路
553 字
3 分钟
BFS 求网格最短路
BFS 求网格最短路
网格最短路适合用 BFS,因为每一步代价相同,第一次到达终点时就是最短距离。
算法题真正要练的是把题目翻译成状态、边界和转移。模板可以帮助提速,但不能替代对条件的判断。
题型识别
先把起点入队,记录访问状态和距离。每次从队列弹出一个格子,尝试向四个方向扩展,越界、障碍、已访问都跳过。
遇到类似题时,我会先写一句话解释输入、输出和约束,再决定用什么结构。只要这一步说不清,直接写代码大概率会在边界条件上出错。
核心写法
from collections import deque
def shortest_path(grid): m, n = len(grid), len(grid[0]) q = deque([(0, 0, 0)]) seen = {(0, 0)} dirs = [(1,0), (-1,0), (0,1), (0,-1)] while q: x, y, d = q.popleft() if (x, y) == (m - 1, n - 1): return d for dx, dy in dirs: nx, ny = x + dx, y + dy if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == 0 and (nx, ny) not in seen: seen.add((nx, ny)) q.append((nx, ny, d + 1)) return -1边界样例
- 空输入或只有一个元素时,答案应该是什么。
- 元素重复时,比较关系是否仍然成立。
- 结果需要下标、长度、数量,还是具体路径。
- 时间复杂度能不能从每个元素处理次数解释出来。
复盘
复盘时要检查起点和终点是否可走,以及距离是从 0 开始还是从 1 开始。
最小验收样例
我会至少准备三个样例:一个普通样例,一个边界样例,一个专门卡比较条件的样例。算法代码最怕只过了题目给的样例,却没有覆盖空输入、重复元素或极端顺序。
写完后不要只看答案,还要能解释每一步状态为什么变化。只要能把状态变化讲清楚,换一个题面时就不容易机械套错模板。
小结
BFS 求网格最短路 的练习重点,是把固定套路拆成可解释的判断。能说明为什么这样维护状态,才算真正掌握。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!













