Сетка состоит из следующих элементов как список списков Python
g = [
['1', '1', '1', '1', '1'],
['S', '1', 'X', '1', '1'],
['1', '1', '1', '1', '1'],
['X', '1', '1', 'E', '1'],
['1', '1', '1', '1', 'X']
]
S указывает начало, E обозначает конец.
1 указывает разрешенные пути, X не разрешенные пути
Простой код обхода BFS:
def find_path_bfs(s, e, grid):
queue = list()
path = list()
queue.append(s)
while len(queue) > 0:
node = queue.pop(0)
path.append(node)
mark_visited(node, v)
if node == e:
break
adj_nodes = get_neighbors(node, grid)
for item in adj_nodes:
if is_visited(item, v) is False:
queue.append(item)
return path
Насколько я могу судить, алгоритм работает правильно со следующим выводом
[(1, 0), (1, 1), (2, 0), (0, 0), (2, 1), (0, 1), (2, 1), (0, 1), (2, 2), (3, 1), (0, 2), (2, 2), (3, 1), (0, 2), (2, 3), (3, 2), (3, 2), (4, 1), (0, 3), (2, 3), (3, 2), (3, 2), (4, 1), (0, 3), (2, 4), (3, 3)]
Каждый кортеж вСписок представляет индексы для узла в исходном графике.
Как переписать мой BFS-код, чтобы он возвращал кратчайший путь вместо всего пути обхода, по которому следовали, чтобы добраться до узла назначения? Я потратил часы, чтобы найти ответы самостоятельно, но пока ябыли неудачными.