你做过的每一张可打印迷宫,背后都有一套算法在决定它长什么样。同样大小的网格,换一种生墙规则,就能从悠长舒缓变成步步惊心。这篇文章用大白话拆解三种经典的迷宫生成算法——它们怎么运作、生成的迷宫风格如何、下一份练习题或谜题书该挑哪一种。
递归回溯算法(DFS)
递归回溯通常是大多数人接触的第一种迷宫算法,原因很简单:思路好懂,生成的迷宫也"讲道理"。
它的核心思路就像名字写的那样。从任意一个单元格出发,把它标记为已访问,然后随机走到一个未访问的相邻单元格,顺手把两者之间的墙打通。一直这么走,直到走进一个所有邻居都访问过的死胡同。这时候开始往回退,一格一格地退,直到找到一个还有未访问邻居的单元格,再继续往前走。当你一路退回起点,且无路可走时,迷宫就生成完毕。
由于算法总是先一头扎到底再回头,生成的迷宫会有又长又绕的主通道,死胡同相对较少。即便走错路,玩家也会觉得自己一直在"前进",所以这类迷宫体验友好、解起来有成就感。
小贴士: 递归回溯是 PuzzleGenio 免费迷宫生成器 的默认算法——如果你是给孩子做迷宫,或者准备课堂练习题,几乎都该选它。
Prim 算法
Prim 算法源自图论,原本是用来求最小生成树的。搬到迷宫里有一个小改动:不再每次挑权值最小的墙,而是随机挑一面。
具体流程是这样的。先把任意一个单元格标记为"已加入迷宫",再维护一个"边界墙"列表,记录所有夹在"已加入"和"未加入"之间的墙。每次从这个列表里随机抽一面墙:如果墙另一侧的单元格还没加入迷宫,就把墙打通、把那个单元格连同它新的边界墙加入列表;如果另一侧已经加入了,就把这面墙丢掉。如此反复,直到边界墙全部清空。
由于算法每次都从当前边界上随机选一个点扩展,而不是顺着上一步往前走,Prim 生成的迷宫有非常鲜明的风格:短小的分叉、密集的死胡同。路径几乎没机会"积累势头"。同样大小的网格下,玩家每走对一步就要先撞上三四个死胡同,难度明显高出一截。
如果你做的是高难度谜题书、密室逃脱道具,或者任何想让玩家"卡到怀疑人生"的场景,Prim 就是首选。
Kruskal 算法
Kruskal 是图论里另一个经典算法。它依赖一种叫并查集(disjoint set)的数据结构,用来快速判断两个单元格是否已经连在同一个区域里。
它的流程几乎和 Prim 反着来。一开始,每个单元格都是独立的小区域,同时把所有内部墙打乱顺序排成一个长列表。然后依次过这些墙:如果墙两侧的单元格已经连通,就保留这面墙——打通它会形成环;如果还没连通,就把墙打通,把两个区域合并成一个。直到所有单元格都属于同一个区域为止。
并查集听起来挺繁琐,但生成的迷宫值回票价。Kruskal 没有"当前位置"这个概念,所以既不像递归回溯那样偏爱长通道,也不像 Prim 那样堆短桩。结果是分支均衡——中等长度的路径居多,死胡同分布稀疏均匀,整体手感公平又不失挑战。
该选哪种算法?
迷宫算法没有绝对的"最优解",怎么选取决于谁来玩、为什么玩。
- 递归回溯——长而蜿蜒的通道,死胡同少。适合孩子、课堂练习题、初次接触迷宫的玩家。默认算法不是没有道理的。
- Prim 算法——分叉短促,死胡同密集,惩罚感强。适合高难度谜题书、密室逃脱道具,以及任何"难才是重点"的场景。
- Kruskal 算法——分支均衡,纹理均匀。适合多样化合集、商业印刷出版,以及想要公平较量的成年玩家。
一个实战小技巧:如果你在做主题谜题册,可以混用算法。开篇用递归回溯让读者建立信心,中段穿插 Kruskal 做调剂,结尾压轴丢一道 Prim 当大 Boss。网格尺寸完全可以保持一致,光换算法就能让难度和手感大幅变化。
自己上手试试
你不需要从零写代码就能感受到三者的差异。打开 免费迷宫生成器,进入"专家"设置,在 Backtracker(递归回溯)、Prim 和 Kruskal 之间切换,保持网格大小不变。视觉差异立刻显现:递归回溯像一条蛇蜿蜒贯穿整页,Prim 像撒了一地的彩色纸屑般遍布死胡同,Kruskal 则稳稳地落在两者中间。
每次导出都附带 PDF 第二页的标准答案、可用于幻灯片的高清 PNG,以及可商用的 SVG(适合设计稿或亚马逊 KDP 自出版谜题书)。无需注册、无水印、无次数限制——一个老实的工具,帮你做出更好的迷宫,无论你的读者偏爱哪种算法。
