BFS 逐行执行器

迷宫 · 代码 · 队列,三处同步

这个页面在做什么。左侧是随机迷宫,右侧是求「入口到最近出口的最短步数」的 Java 代码。按单行推进时,高亮行就是当前执行到的位置,迷宫上的白色实框是刚出队的 (x, y),黄色虚框是正在检查的 (nx, ny),下方管道是队列的实时状态。

看第 9 行和第 22 行的配合。每弹出一个格子,最多向队尾压入四个新格子,队列因此先胀后缩。峰值不取决于总格数,而取决于波前最宽的那一层——这就是 BFS 的空间复杂度来源。

第 17 行是防重复的唯一防线。把它去掉,格子会被反复入队,队列爆炸。标记时机在入队时(第 23 行)而不是出队时,否则同一格会在队列里出现多次。

第 19 行触发时立刻 return。此刻的 d + 1 必然是最小值——所有距离更近的格子早已出队检查过了。这就是 BFS 求最短路的全部依据。

值得试的两件事。把环路密度拉到 0,迷宫是一棵树,波前会分叉成细丝;拉到 60% 以上,通路互相连通,队列峰值成倍增长。点击迷宫任意通路可以改起点,看波前从不同位置铺开的形状。

速度 规模21×13 环路15%
队列长度
1
峰值
1
当前 d
0
已出队
0
可达
0
起点 队列中 已出队 出口 正在检查
队列 · 先进先出长度 1 · 峰值 1
↓ 入队 出队 ↓ 队尾

    
就绪。点击迷宫任意通路可改起点。