よく知られているスライディング パズルのさまざまな可能な状態を持つツリーを作成しようとしています。
わからない場合は、次のようなものです。
[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