这个页面在做什么。左侧是随机迷宫,右侧是求「入口到最近出口的最短步数」的 Java 代码。按单行推进时,高亮行就是当前执行到的位置,迷宫上的白色实框是刚出队的 (x, y),黄色虚框是正在检查的 (nx, ny),下方管道是队列的实时状态。
看第 9 行和第 22 行的配合。每弹出一个格子,最多向队尾压入四个新格子,队列因此先胀后缩。峰值不取决于总格数,而取决于波前最宽的那一层——这就是 BFS 的空间复杂度来源。
第 17 行是防重复的唯一防线。把它去掉,格子会被反复入队,队列爆炸。标记时机在入队时(第 23 行)而不是出队时,否则同一格会在队列里出现多次。
第 19 行触发时立刻 return。此刻的 d + 1 必然是最小值——所有距离更近的格子早已出队检查过了。这就是 BFS 求最短路的全部依据。
值得试的两件事。把环路密度拉到 0,迷宫是一棵树,波前会分叉成细丝;拉到 60% 以上,通路互相连通,队列峰值成倍增长。点击迷宫任意通路可以改起点,看波前从不同位置铺开的形状。