【发布时间】:2018-03-13 05:43:40
【问题描述】:
我正在尝试创建具有众所周知的滑动拼图的不同可能状态的树
如果你不知道,它是这样的:
[3 5 2]
[4 1]
[8 6 7]
你必须把它变成这样:
[1 2 3]
[4 5 6]
[7 8 ]
基本上,每个状态都会生成新状态,具体取决于空白空间的移动方式(向上、向下、向左或向右)
我想要的是创建树,所有状态都给定根作为拼图的初始状态,但是当向树添加子(新状态)时,它应该检查该状态是否已经添加到树
您介意帮我实现吗?在此先感谢:)
这是我当前的代码,它抛出 RecursionError: maximum recursion depth exceeded while calling a Python object
节点类:
class Node(object):
def __init__(self, value, parent=None):
self.parent = parent
self.value = value
self.children = []
def append(self, obj):
if obj is not self.parent and obj not in self.children and obj is not None:
self.children.append(obj)
def has_children(self):
return len(self.children) > 0
def __iter__(self):
yield self.value
for v in chain(*map(iter, self.children)):
yield v
def find_root(self):
p = self
while p.parent is not None:
p = p.parent
return p
树生成方法(将self视为拼图状态):
def to_tree(self, parent=None):
values = []
if parent is not None:
for child in parent.find_root():
values.append(child)
value = nd.Node(self, parent)
if value not in values:
children = [move[1].to_tree(value) for move in self.get_possible_movements()]
for child in children:
if child is not None:
value.append(child)
return value
else:
return None
【问题讨论】:
-
在您的情况下,
if value not in values:语句似乎始终评估为True。 -
是的,它叫做puzzle8游戏。
-
这里有一件事:因为你总是可以从 A 移动到 B,反之亦然,所以在树中将 A 置于 B 之下的两者之间不存在任何排序,也不存在将 B 置于 A 之下的任何排序。相反,您所拥有的是一个图,其中顶点是状态,边是滑动一个图块的原子操作。
标签: python python-3.x recursion tree sliding-tile-puzzle