生成二维迷宫的算法


Answers:



8

我更喜欢Kruskal算法创建的紧密缠绕的迷宫。

Kruskal算法的标准描述是不合适的,因为它无法区分图中的位置和位置组,而依赖于关于数据结构选择的双关语,从而导致描述模糊,使新手感到困惑。因此,我拒绝克鲁斯卡尔的术语。

我将使用以下术语:

  • 图形
    • 迷宫本身。
  • 节点
    • 在迷宫中的位置。在方形迷宫上,这是一个方形单元格。
  • 边缘
    • 两个节点之间的连接。在方形迷宫上,这是1个长度的条。
  • 树群
    • 一组节点,可能是空的,排列成一棵树

从这些中,我们得到:

  1. 图树组创建一个组GTG,其中包含树组
  2. 在迷宫中的每个位置,用一个包含一个节点的树组填充GTG
  3. 创建边缘集E
  4. 用迷宫中的每个有效边填充E
  5. GTG中有多个组且E不为空时:
  6. E中选择随机边缘rE
  7. 识别端点P1P2RE
  8. E删除rE
  9. 检查哪些组p1p2属于(分别为p1gp2g)。
  10. 如果P 1 GP2G是不同的,加入树正群P 1 GP2GP1 - > P2,并改写一个树的所有组所有权给对方,从而加入了树。
  11. 返回步骤5。
  12. 如果没有边缘,只有一棵树,则说明该图形未连接或存在错误。
  13. 如果只有一棵树,那么您就有一个完整的无环迷宫。

1
我们有一个GUI项目,并且必须在GUI上构建一个随机的2D迷宫。这正是我做到的方式,但我从未意识到我在使用Kruskals大声笑。我绝对意识到我已经使用了图表。
布莱恩·哈灵顿


1

一种简单的方法是列出北墙和西墙,然后对其进行置换。给每个房间一个号码。然后,炸毁列表中的一堵墙,只要两个房间没有相同的编号,然后将这些编号之一传播到所有其他具有相同编号的房间。继续走下去,直到用完墙壁。这适用于矩形迷宫,或者实际上是任何其他迷宫,您可以在其中给出“潜在连接的房间”列表。另外,编程非常简单。




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.