Поиск кратчайшего пути в 2d-массиве

#java #algorithm #graph-theory #shortest-path

#java #алгоритм #теория графов #кратчайший путь

Вопрос:

Мне нужно найти кратчайший путь сверху слева направо.

Правила таковы, что он должен проходить от A до B, от A до B и т.д.

Смотрите картинку в качестве примера:

введите описание изображения здесь

Тогда ожидаемый результат для приведенного выше рисунка равен 13.

Я пытаюсь реализовать это на java с помощью алгоритма дейкстры для этого, но затем застрял. Правильный ли это путь?

Комментарии:

1. Нужно ли это реализовывать поверх изображения? @David

2. Алгоритм Дейсктры наверняка является одним из способов решения проблемы (другим возможным алгоритмом может быть A * ). Вы должны сказать нам, где именно вы застряли (если это проблема с кодом, тогда покажите код, который у вас есть на данный момент), но я предполагаю, что это связано с расположением графика. В принципе, вы могли бы предположить, что если две соседние ячейки имеют одинаковое значение, то между ними есть «стена», поэтому ребра графика могут находиться только между соседними ячейками с разными значениями.

3. Я пытаюсь реализовать это на Java

4. Просто реализуйте алгоритм A *.

5. Итак, что вы пробовали? Существует много страниц, посвященных этой теме. baeldung.com/java-dijkstra

Ответ №1:

Если цель состоит в том, чтобы найти кратчайший путь из верхнего левого угла в нижний правый угол (или между любыми произвольными 2 точками), dijsktra является одним из возможных способов, однако вы должны правильно построить график из входных данных.

В этом случае я бы выбрал простой flood-fill алгоритм. Вы можете найти несколько онлайн-ресурсов, объясняющих это, включая это видео или эту статью, поэтому я не буду вдаваться в подробности в этом ответе.

Вы можете найти кратчайший маршрут, используя только 2 матрицы (одна для вашего исходного массива букв и одна для расстояний), если вы правильно реализуете свои правила (только от A до B и от B до A).

Ответ №2:

Вы можете использовать любой алгоритм обхода графа или любой алгоритм поиска пути. Итак, здесь много алгоритмов, таких как A *, Dijekstra, BFS, DFS …

Для примера давайте возьмем BFS, которая находит кратчайший путь между 2 узлами графика. Предположим, ваш 2d-массив представляет собой график, где ребра находятся при условии, что расстояние между 2 узлами равно 1 и один из узлов равен A, а второй — B. Режим чтения о BFS здесь (https://en.wikipedia.org/wiki/Breadth-first_search )

Просто постройте график из вашей матрицы и реализуйте BFS для графика, или вы можете просто реализовать BFS для массива.