寻路算法可视化
在网格上逐步回放 BFS、DFS、Dijkstra 与 A*(曼哈顿 / 欧氏启发式)的搜索过程:可以直接在画布上画墙、拖动起点终点,对比访问格子数与最终路径。
浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。
地图与算法
四种算法都在 pathfinding-visualizer.ts 里以纯函数运行,返回访问顺序与最终路径,界面只负责回放;邻居顺序固定为「上、右、下、左」。
可视化
可以到达143115时间 O(格子数)(A* 取决于启发式质量),空间 O(格子数)。
这个工具能做什么
- 讲搜索算法时把同一张地图依次交给 BFS、DFS、Dijkstra 和 A*,看谁先把格子铺满、谁只沿着目标方向推进,访问格子数的差别一眼就能看出来。
- 验证「A* 是加了启发式的 Dijkstra」:两者算出的路径步数完全一样,但访问格子数不同,切一下启发式就能看出启发式质量对搜索范围的影响。
- 直接在地图上画墙、拖动起点终点,复现「两点之间直线最短、但中间有堵墙就得多走一段」这类直觉,并立刻看到路径步数从曼哈顿距离变成实际绕行距离。
- 排查游戏或机器人项目里的寻路问题:把地图画成 # / S / E 文本粘进来,先确认标准实现给出的路径步数,再和自己代码的结果对比。
示例
输入
默认地图(中间一列是墙,起点左上、终点右上)配合 BFS
输出
可以到达,访问 31 个格子,路径 15 格 / 14 步
起点到终点的曼哈顿距离只有 6,但中间那列墙只能从最下面一行绕过去,所以实际是 14 步。同一张图上换成 DFS 只访问 15 个格子就碰到终点,步数同样是 14 —— 不过 DFS 不保证最短,换一张地图就可能绕远。
常见问题
A* 一定比 BFS 快吗?
在启发式可采纳(不高估真实剩余步数)的前提下,A* 展开的节点集合是 BFS 访问集合的子集,所以访问格子数不会更多,本工具的曼哈顿与欧氏启发式都满足这个条件。但「不会更多」不等于「一定更少」:当起点和终点在同一行、网格又很空旷时优势最大;如果地图本身逼着路径绕大圈,两者可能铺满同样的区域。
DFS 找到的路径是最短的吗?
不是。DFS 沿一条分支走到死胡同才回退,第一次碰到终点就返回,路径长度取决于邻居访问顺序。本工具把邻居顺序固定成「上、右、下、左」,所以同一张地图上结果可复现,但它只保证路径连续、不保证步数最少;要最短请用 BFS、Dijkstra 或 A*。
启发式该选曼哈顿还是欧氏?
四连通网格(只能上下左右走)上,曼哈顿距离更贴近真实步数,信息量更大,A* 展开的节点通常更少;欧氏距离在同样条件下会低估更多,搜索范围往往更大。如果地图允许斜着走,就该换成对角距离(Octile)。
怎么在图上画墙、移动起终点?
画布上按住左键拖动即可画墙(从墙上按下则是擦除)。把「鼠标左键的操作」切成「移动起点」或「移动终点」,再点任意空格就能把 S / E 挪过去,改动会同步写回上面的文本框,所以两种编辑方式可以混用。
地图最大能画多大?
60 × 60 个格子。地图是纯文本,# 是墙、S 是起点、E 是终点、. 是空地,每行长度必须一致,且只能有一个 S 和一个 E。搜索本身是 O(格子数) 的,真正的上限来自画布上的格子尺寸和逐帧回放的帧数。
关键词:pathfinding visualizera stardijkstrabreadth first searchdepth first searchmazeheuristic寻路算法可视化A* 算法最短路径迷宫广度优先启发式搜索