Я пытаюсь найти кратчайший путь на сетке (список списков кортежей) Я получил это до сих пор:Python, рекурсивный ширина первого поиска
def planPath(self, x, y, goal, board):
visited = []
path = []
def pathFinder(curr):
visited.append(curr)
neighbors = None
if curr == goal:
visited.append(curr)
return curr
neighbors = [neighbor for neighbor in curr.neighbors if type(neighbor) is not Land.Water and neighbor not in visited]
neighbors.sort(key=lambda neighbor: abs(neighbor.location[0] - goal.location[0]) + abs(neighbor.location[1] - goal.location[1]) + abs(neighbor.elevation - goal.elevation), reverse=False)
х, у текущее местоположение , очевидно, и доска, ну и вся доска. Мысль заключалась в том, что он будет рекурсивным. Для каждого вызова я получал бы соседей для текущего узла, отфильтровывал воду (неравномерно) и посещал. Затем сортируйте ближе к цели. Далее я хочу пройти и сделать первый поиск по ширине. Поэтому я буду расширять всех соседей, затем расширять каждого из своих соседей и так далее. Каждая ветка продолжалась до тех пор, пока у них не будет соседей, они вернут Ничего и сделают это. Тогда конечным результатом является то, что единственным, кто будет возвращаться, станет первый брелок, который достигнет цели, т. Е. Самый короткий. Кто-нибудь знает, как я могу это сделать?
Я думал, это:
for neighbor in neighbors:
next = pathFinder(neighbor)
if next:
visited.append(cure)
return curr
else: return None
но, поправьте меня, если я ошибаюсь, но это привело бы к глубине первого поиска, а не вширь.
Ваших отступы по всей карте (смесительные и табуляции никогда не является хорошей идеей). Я сделал все возможное, чтобы исправить ситуацию, вы можете проверить свой пост? –
Yup выглядит правильно. Спасибо за исправление. – EasilyBaffled
Рекурсия не является естественным приспосабливанием для поиска по ширине. Это имеет смысл, если вы выполняете поиск по глубине, поскольку стек вызовов помогает отслеживать местоположения, которые вы посещали до сих пор. Для поиска по ширине вы хотите вместо этого использовать очередь. См. [Этот связанный вопрос] (http://stackoverflow.com/questions/2549541/performing-breadth-first-search-recursively) для дальнейшего обсуждения. – Blckknght