Нашли ошибку?

Выход из лабиринта

СредняяДописатьГлава 6

#поиск в ширину#очереди#граф на сеткеid: ga-maze-steps

Лабиринт задан списком строк: # — стена, . — проход, S — старт, E — выход. За один шаг можно пойти вверх, вниз, влево или вправо. Допишите maze_steps(maze): функция возвращает минимальное число шагов от S до E или -1, если выхода не достичь. Пропуски помечены # TODO.

Пример

maze_steps([
    "S.#",
    ".##",
    "..E",
])  # 4

Ограничения

Решение

from collections import deque


def maze_steps(maze: list[str]) -> int:
    """Минимальное число шагов от S до E или -1."""
    rows, cols = len(maze), len(maze[0])
    start = next((r, c) for r in range(rows) for c in range(cols) if maze[r][c] == "S")
    dist = {start: 0}
    queue = deque([start])
    while queue:
        r, c = queue.popleft()
        if maze[r][c] == "E":
            return dist[(r, c)]
        for dr, dc in ((1, 0), (-1, 0), (0, 1), (0, -1)):
            nr, nc = r + dr, c + dc
            # TODO: если (nr, nc) внутри поля, не стена и ещё не посещена —
            #       запишите расстояние и поставьте клетку в очередь
            pass
    return -1

Можно решать и в своём редакторе: «Скопировать с тестами» и запустите python3 maze_steps.py — тесты те же, результат покажет ✓ / ✗ и итог.