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 求网格最短路 的练习重点,是把固定套路拆成可解释的判断。能说明为什么这样维护状态,才算真正掌握。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

BFS 求网格最短路
https://blog.tjcheng.cn/posts/daily/2026-07-05/bfs-shortest-path-grid/
作者
TengJinCheng
发布于
2026-07-05
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
TengJinCheng
Hello, I'm Teng.
公告
欢迎来到TengJinCheng工作铺!
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
157
分类
7
标签
114
总字数
109,939
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.4
文章许可
CC BY-NC-SA 4.0

文章目录