跳到主内容
UniKit

寻路算法可视化

在网格上逐步回放 BFS、DFS、Dijkstra 与 A*(曼哈顿 / 欧氏启发式)的搜索过程:可以直接在画布上画墙、拖动起点终点,对比访问格子数与最终路径。

浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。

地图与算法

四种算法都在 pathfinding-visualizer.ts 里以纯函数运行,返回访问顺序与最终路径,界面只负责回放;邻居顺序固定为「上、右、下、左」。

60
鼠标左键的操作

可视化

已访问最终路径墙起点终点
进度 0 / 46
结果可以到达
路径步数14
访问格子数31
路径格子数15
复杂度

时间 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* 算法最短路径迷宫广度优先启发式搜索

同类工具