Кратчайший путь в невзвешенном 2D-массиве. Как показать шаги / направления, сделанные во время BFS

В этом алгоритме я пытаюсь найти кратчайший путь из заданной начальной точки (S) и заданной конечной точки (D) для заданного 2D-массива, имея в виду, что некоторые элементы в массиве (*) считаются препятствиями. Обычно я бы выполнил типичный BFS и вернул расстояние кратчайшего пути, но есть небольшая морщина. Мне нужно показать кратчайший путь (и), пройденный путем замены пройденного элемента кардинальным направлением (север, юг, восток или запад. Сокращенно n, s, e, w соответственно), по которому путь ведет к месту назначения. В случае нескольких кратчайших путей, по которым вы можете пойти ЛИБО на юг или восток, чтобы достичь цели, элемент будет заполнен комбинацией сторон света, то есть такими, как показано на втором рисунке. ОБРАТИТЕ ВНИМАНИЕ, что это не означает юго-восток, поскольку диагональные обходы не допускаются. Я знаком с использованием BFS в алгоритмах, но я немного застрял в том, как я отмечаю путь (пути), пройденный с помощью направления включены. Я не обязательно ищу полноценный алгоритм для ответа на этот вопрос, я скорее ищу ответ в виде псевдокода, который направит меня на верный путь. Первое изображение представляет собой образец входного массива, а второе изображение - решение указанного входного массива. TL: DR Я прошу совета относительно того, как отслеживать направления, взятые через сетку при выполнении BFS. Любая помощь / отзывы приветствуются и заранее благодарны!

Пример входного 2D-массива

Пример выходного 2D-массива


person Genghis Conn    schedule 02.10.2020    source источник


Ответы (1)


Вы можете пометить каждый узел (запись массива) одним фрагментом метаданных: самой короткой длиной пути. Это можно сделать с помощью различных алгоритмов, но BFS в основном поможет вам в этом. У каждого достижимого узла должен быть номер.

В вашем примере S будет нулем (нулевые шаги для перехода от S к S), а D - 16 (16 шагов для перехода от S к D). Теперь у вас есть все необходимое.

Ты можешь сейчас:

1: выберите конечный узел (d = 16)

2: поиск в непосредственной близости (n, e, s, w)

3: если узлы имеют d-1, напишите (добавьте) букву в зависимости от того, на какое из четырех направлений в его окрестности вы смотрели. Игнорируйте другие узлы.

4: выберите все узлы с d-1 и как минимум с одной буквой

5: Для каждого выбранного узла, выполните шаги 2–3

6: если (d-1 ›0) d = d-1 и выполнить шаги 4–5

Это грубая форма алгоритма, который это сделает. Это будет работать для D в любом месте. Если, однако, вы переместите S, вам нужно повторно пометить каждый узел.

person Mrk Sef    schedule 02.10.2020