Короткая тропа в лабиринте

тема: BFS/DFS · уровень: средний

Условие

Юный искатель приключений попал в древний лабиринт. В одной клетке он стартует (S), в другой лежит артефакт (T). За один ход можно перейти в соседнюю по стороне клетку (вверх/вниз/влево/вправо), но стены (#) непроходимы.

Нужно узнать, за сколько ходов можно добраться до артефакта кратчайшим путём. Если пути нет — сообщить об этом.

Формат ввода

Формат вывода Выведите одно целое число — минимальное число ходов от S до T. Если добраться нельзя, выведите -1.

Ограничения

Пример Ввод:

4 5
S..#.
##.#.
...#.
.#..T

Вывод:

7

Как решать — идея подхода

Приём: BFS (поиск в ширину) на решётке

Ключевое наблюдение: каждый ход в соседнюю клетку стоит одинаково (1). Значит, лабиринт можно представить как граф, где вершины — клетки, а рёбра — переходы вверх/вниз/влево/вправо. В таком графе кратчайшие расстояния от старта до всех клеток надёжно находит BFS (поиск в ширину): он расширяет «фронт» слоями по расстоянию 0, 1, 2…

Почему BFS работает: очередь гарантирует, что мы обрабатываем клетки в порядке неубывающего расстояния, поэтому как только до клетки дошли впервые, это уже минимальное число шагов.

План решения:

Мини-сниппет перехода: dist[nx][ny] = dist[x][y] + 1.

Сложность: каждая клетка попадает в очередь максимум один раз, поэтому время O(m*n), память O(m*n).

Частая ошибка: пытаться решать DFS (поиск в глубину) — он не гарантирует кратчайший путь; или отмечать клетку посещённой слишком поздно, из-за чего она добавляется в очередь много раз.

Решить задачу с автопроверкой на Python →

Куда дальше