图的应用-迷宫生成器


项目代码传送门

1. 基于图的遍历

算法思想:

我们把迷宫看成一个图网络结构——迷宫中每个像素点构成图的顶点集,每个顶点与其相邻的上下左右至多4个顶点连通,其连通边构成图的边集。

迷宫路径就是图的一个连通子图,即一次遍历的结果。故其生成的迷宫的起点到终点的路径是唯一的。

一般地,因为生成图的边集和点集的规模大小相近,所以是一个稀疏图,应该使用邻接表存储,但python中,numpy的矩阵处理的速度总体上比较快,所以我代码里面使用邻接矩阵进行存储

1.1. 随机BFS

上图中,白色是路径,黑色为障碍物

广度优先很少用来生成迷宫。因为即使每次都可以随机选择下一步的方向,但实际上迷宫是按层生成的,每一步可选择的方向基本都被遍历过了,可选择方向的自由度是很少的,且往往只有一个选择的空间。故可以看出来,其生成的迷宫呈规则的条型状,并不适合迷宫的生成。

1.2. 随机DFS

1.3. 随机最小生成树

应用的是prim算法。

2. 基于图的连通性

算法思想:

我们把迷宫看成一个凸多边形。对于一个凸多边形,我们可以使用两条相交的直线,将其划分为为至多4个小区域。设该多边形划分为n个小区域,则在任意n-1个公共边上开一个小洞,即可将所有的区域连通。

对划分后的区域不断重复上述划分和开洞操作,直到划分后的区域不可以再分割,则形成一个连通的迷宫。

其起点到终点的路径是唯一的。

2.1. 递归分割

3. 附:各种算法生成迷宫比较

BFS DFS
prim recursive_division

4. 下一步工作

迷宫寻路、给迷宫上色以及生成roguelike类型的迷宫等工作,后面有时间再慢慢填这个坑了~

5. references

Visualizing Algorithms

[迷宫中的算法实践]迷宫问题算法综述 - 玮仔Wayne - 博客园


评论
  目录