首先,请原谅糟糕的头衔,但我不知道如何用一句话来形容这一点......
给定一个包含3种字段,空字段,墙和出口的网格,我编写了一个程序来检查每个空字段,该字段是否安全"。 一个人走过那个网格,但只能走非对角线,不能穿过墙壁。从一个场开始,该人随机选择一个方向并开始以这种方式行走。一旦它碰到墙壁,它会再次随机选择一个方向,开始进入那个方向,依此类推。 如果从该字段开始如上所述遍历网格的人保证在某个时刻找到出口,则该字段被认为是安全的。
我写了一个Python程序来解决这个问题。它构建了一棵树"对于它检查的每个字段,包含该字段的每个可能路径。 我有一个函数只返回" parent"给定节点,通过递归地将当前节点的父节点添加到节点列表,直到它到达最顶层节点。
只检查一个字段时,程序按预期工作,例如(1,4)。但是,在检查示例网格的所有字段时它不起作用。
我已经调查过它,并意识到在检查所有节点时,返回给定节点的所有父节点的alle_parents()函数会产生意外结果。例如。当检查字段(1,4)时,该节点的一个子节点是(1,8)。 (1,8)的父母应该是(1,4)。但事实并非如此。 alle_parents((1,8))返回许多不应该存在的不同字段。但是,我无法弄清楚它为什么会这样做。我唯一的猜测是它与#34;剩余的"数据/ GC未按预期工作。
相关代码:
class Knoten():
def __init__(self, x, y, parent = None):
self.x = x
self.y = y
self.parent = parent
self.children = []
n = len(spielfeld)
m = len(spielfeld[0])
for k in range(n):
for j in range(m):
if spielfeld[k][j] not in [None, '#', 'E']:
baum = []
i = 0
ebene = []
ebene.append(Knoten(k, j))
baum.append(ebene)
i += 1
while i <= 100:
ebene = []
for knoten in baum[i - 1]:
children = []
if spielfeld[knoten.x][knoten.y] == 'E':
continue
for feld in next_feld(knoten.x, knoten.y):
knoten_neu = Knoten(feld[0], feld[1], knoten)
hinzufuegen = True
for parent in alle_parents(knoten_neu):
if knoten_neu.x == parent.x and knoten_neu.y == parent.y:
hinzufuegen = False
if hinzufuegen:
ebene.append(knoten_neu)
children.append(knoten_neu)
knoten.children = children
if children == []:
if spielfeld[knoten.x][knoten.y] != 'E':
spielfeld[k][j] = '%' # Field not safe
baum.append(ebene)
i += 1
def alle_parents(knoten, parents = []):
if knoten.parent == None:
return parents
else:
parents.append(knoten.parent)
return alle_parents(knoten.parent, parents)
我使用的示例地图:
############
# # # #
# ## #
# # E# #
# ## #
# #
# #E E###
############
完整代码(部分内容为德语,对不起):Emmet Cheat Sheet
答案 0 :(得分:1)
我怀疑你的问题是一个常见的Python问题。这一行:
def alle_parents(knoten, parents = []):
加载模块时创建一个空数组,而不是每次调用该函数时都创建一个空数组。对alle_parents()的未来调用将重用相同的数组(可能已经增大了)而不是新的空数组!解决的一个好方法是:
def alle_parents(knoten, parents = None):
parents = parents or []