我想学习如何产生一个完美的迷宫。我试图了解递归分割算法。我无法理解如何实现这个算法。这是我的代码:
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'
我不想问你我的代码。我只是想了解如何实现这个算法,我错在哪里以及我应该做什么。我需要在没有封闭区域的情况下生成一个完美的迷宫。
答案 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
小写字母(x
,y
)是网格坐标;大写字母(X
,Y
)是迷宫坐标。哈希标记#
始终是墙,但加号+
最终会成为通道或墙。
第二个问题是递归本身。构建墙后,将活动空间细分为两个区域。您现在必须将算法应用于两个新区域。
所以而不是:
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);
当然你必须有一个条件来阻止你的递归,但你已经有了这个:当空间太小时,你不会建造更多的墙。
您示例中的大房间显示您只是递归到迷宫的一个新子部分。大房间是你没有进入的房间。