1991年,一台DOS机器,一块BGI图形驱动程序,一段随手写下的程序在屏幕上画出彩色的树。它本不是迷宫生成器,却意外成了迷宫。上周末,35年和两次重写之后,作者终于让它住进了浏览器里。一个90年代初反复画树枝的几何实验,就这样把一条算法线索悄悄埋进了时间胶囊。
故事的开头不是“让我造个迷宫”,而是一棵不断分叉的树。始于二叉树——每根枝杈裂成两条;接着是三叉树,三条分支各自延伸。某个时刻,作者把三条分支围成相互呈45度角的构型,顿悟瞬间发生:一棵永不自我交叉、从根到叶始终只有唯一通路的树,就是迷宫。“完美迷宫”不过是无环的生成树。这个洞见并非来自图论教科书,而是用画线的双手直接摸到了。
递归回溯的骨架随即浮现:选一个点,沿几个方向之一长出一段枝,递归深入;撞墙则回退,另寻方向。后来的算法研究者一眼就认出——这正是一种随机化深度优先搜索,后来被归入“递归回溯法”迷宫算法一族。
但作者想说得精确,因为这一点很重要:他没有发明回溯,没有发明随机化DFS,也没有发明通过生成树生成迷宫。回溯的形式化技术可追溯至D.H. Lehmer在20世纪50年代的工作,在网格上跑随机DFS,对任何当时正用程序生成树的人来说,都是水到渠成的自然想法。作者要说的只是:他完全通过视觉/几何路径独自走到了这里,在从没看到任何名为“迷宫生成算法”的文字记录之前。
这段往事里有一处冷静的对照,比所谓“首次发现”更有意味。这一技术稍后在开发者社区真正广为人知,要归功于Jamis Buck在2010年至2011年间那套著名的迷宫算法系列博客——那时作者写完LABYR.PAS已经近二十年。两个人,隔了两个十年,从截然不同的方向触到了同一个想法。站在今天看,这恰恰说明某些生成式思维模式的底层共性:当你用分支和空间约束逼问一道视觉题目,答案的形状可能穿越时间,反复重现。
1991年的源代码LABYR.PAS,完全写在Turbo Pascal里,依托crt与graph单元,面向BGI输出。其中几处设计选择放到现在仍未褪色。一个值得拆解的例子:预计算排列表。算法在任意给定朝向下,可以向三个可能方向转弯——从不回头。通常的处理是在运行时对三个选项做一轮洗牌,但在当年那台资源吃紧的DOS机器上,作者选择一次性预算出三个项目的全部六种排列,放进查找表:
constdn: array [1..6,1..3] of integer =((1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1));
每次需要决定分支方向,从1到6中随机抽一个索引,就能打乱转弯顺序。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.