由 Rust + WebAssembly 生成迷宫并逐步搜索最短路径
起点 终点 待扩展 已扩展 最短路径
点击「开始寻路」
切换算法后再次寻路,比较两者扩展的格子数 | 在迷宫里拆掉几堵墙,会出现多条路线
先用「递归回溯」算法生成一座完美迷宫(任意两点之间有且只有一条通路),再用 A* 或 Dijkstra 算法一步步搜索从起点到终点的最短路径。蓝色是待扩展的边界,棕色是已经扩展过的格子,橙色是最终找到的路径。
h(n):对到终点剩余距离的估计。每次扩展 f = g + h 最小的格子,让搜索优先朝终点方向推进。只要 h 从不高估真实距离(曼哈顿距离在只能上下左右移动的网格上满足这一点),A* 同样保证找到最短路径。BinaryHeap)实现,每次取最小值的复杂度是 O(log n)。f 相同时优先扩展 h 更小(离终点更近)的格子,能进一步减少扩展数量。已经扩展过的旧堆条目直接跳过(惰性删除)。maze_generate(61, 41, 种子):Rust 生成迷宫并保存在全局状态中。search_start(起点, 终点, 是否用 A*),Rust 初始化 g 值数组、父节点数组和优先队列。search_step(N),Rust 扩展最多 N 个格子(速度滑块控制 N = 1 ~ 512),这样就能看到搜索的动画过程。maze_cells() 取回每个格子的状态(每格 1 字节),写进一张 61×41 的小 ImageData,再关闭平滑、放大绘制到画布上。点击画布修改墙壁或移动起点、终点时,JS 会调用 maze_toggle_wall() 或 search_clear() 清除上一次的搜索结果。
drawImage 放大绘制,没有逐格调用 fillRect。源码crates/algorithms/pathfind/src/lib.rswww/pathfind/index.js