迷宫生成 - 递归除法(它是如何工作的?)

时间:2017-01-09 17:41:02

标签: c++ algorithm recursion maze

我想学习如何产生一个完美的迷宫。我试图了解递归分割算法。我无法理解如何实现这个算法。这是我的代码:

accuracy = int(input("accuracy:  "))

current = 2
opperation = "+"
number = 3
count = 1

for i in range (accuracy):
    if opperation == "-":
        number = number - (4/(current*(current+1)*(current+2)))
        opperation = "+"
    elif opperation == "+":
        number = number + (4/(current*(current+1)*(current+2)))
        opperation = "-"
    current += 2
    print(str(count).zfill(8)) + ":    " + str(number)
    count += 1

这段代码有问题,因为它经常冻结程序(某处无限循环),但如果它有效,它就会生成一个像这样的'迷宫': Generated 'maze'

我不想问你我的代码。我只是想了解如何实现这个算法,我错在哪里以及我应该做什么。我需要在没有封闭区域的情况下生成一个完美的迷宫。

1 个答案:

答案 0 :(得分:2)

首先,您必须决定如何设计迷宫。您使用整个单元格来表示墙壁或通道。这意味着您对选择的数字作为新墙和通道有一些限制。在您的示例中,不应创建两个垂直墙相邻而没有通道的厚墙。

使用您的方法,N×N迷宫由(2*N + 1)×(2*N + 1)数组表示。您有“迷宫”坐标0到N,“网格”坐标0到2*N + 1。在迷宫坐标中执行算法并在创建墙时使用网格坐标。

在网格坐标中,墙必须是偶数索引,并且corridord必须是奇数索引。这两个指数在最后的迷宫中都是一面墙,两个指数奇数总是一个自由单元格。一个甚至一个奇怪意味着可能穿过墙壁。

为了说明,这里是a4×4迷宫:

 X    0   1   2   3

 x  0 1 2 3 4 5 6 7 8

    # # # # # # # # #   0
    #   +   +   +   #   1  0
    # + # + # + # # #   2
    #   +   +   +   #   3  1
    # + # + # + # # #   4
    #   +   +   +   #   5  2
    # + # + # + # # #   6
    #   +   +   +   #   7  3
    # # # # # # # # #   8

                        y  Y

小写字母(xy)是网格坐标;大写字母(XY)是迷宫坐标。哈希标记#始终是墙,但加号+最终会成为通道或墙。

第二个问题是递归本身。构建墙后,将活动空间细分为两个区域。您现在必须将算法应用于两个新区域。

所以而不是:

    if (wallY < maxy - wallY)
        divison(x, wallY, maxx, maxy, !h);
    else if (wallY > maxy - wallY)
        divison(x, y, maxx, wallY, !h);

你应该这样做:

    divison(x, wallY, maxx, maxy, !h);
    divison(x, y, maxx, wallY, !h);

当然你必须有一个条件来阻止你的递归,但你已经有了这个:当空间太小时,你不会建造更多的墙。

您示例中的大房间显示您只是递归到迷宫的一个新子部分。大房间是你没有进入的房间。