我的目標是創建一個功能,讓機器人解決迷宮問題。該類鍛鍊; Tibial其目的這裏深度優先搜索是模板....使用Python解決迷宮問題
機器人只能前進或右轉即時知道什麼名字代碼中的每個模板......比如什麼「孩子」會成爲「節點」嗎?
我使用印花布(讓我在python程序)和圖書館Myro做到這一點。
這是一個相當晚的帖子,但對那些感興趣的人來說,這最終成爲最終的DFS。 而且還代碼規劃移動
class Node:
def __init__(self, x, y, direction):
self.x = x
self.y = y
self.direction = direction
__left = { 'N' : 'W',
'E' : 'N',
'S' : 'E',
'W' : 'S' }
__right = { 'N' : 'E',
'E' : 'S',
'S' : 'W',
'W' : 'N' }
__dx = { 'N' : 0,
'E' : 1,
'S' : 0,
'W' : -1 }
__dy = { 'N' : 1,
'E' : 0,
'S' : -1,
'W' : 0 }
def __str__(self):
return "<%d,%d,%s>" % (self.x, self.y, self.direction)
def _left(self):
return Node(self.x, self.y,
self.__left[self.direction])
def _right(self):
return Node(self.x, self.y,
self.__right[self.direction])
def _forward(self):
return Node(self.x + self.__dx[self.direction],
self.y + self.__dy[self.direction],
self.direction)
def children(self):
return [ ('left', self._left()),
('right', self._right()),
('forward', self._forward()),
]
def dfs(node, soughtValue, visitedNodes):
if node.x == soughtValue.x and node.y == soughtValue.y and node.direction == soughtValue.direction:
return []
newVisited = visitedNodes[:]
newVisited.append(node)
for action, adjNode in node.children():
if adjNode not in newVisited:
plan = dfs(adjNode, soughtValue, newVisited)
if plan is not None:
p = [action]
p.extend(plan)
return p
return None
感謝,雖然所有的答案!
哦,通常'node'和'children'意味着你要使用[鏈接列表]的一些變種(http://en.wikipedia.org/wiki/Linked_list)。由於您正在嘗試建模迷宮,因此您將使用[圖表](http://en.wikipedia.org/wiki/Graph_%28data_structure%29)。否則,我不確定你的問題是什麼。 – 2rs2ts
爲什麼你初始化Todo'(root,[])'?不應該是'[root]'? – njzk2
'在訪問過的節點'和'children.remove(visited)'實現相同我認爲 – njzk2