Найти в Дзене
Nuances of programming

Как найти выход из лабиринта с помощью Python

Оглавление

Источник: Nuances of Programming

Создание лабиринта

Наш лабиринт будет в виде матрицы размером n*m с нулями для проходов и единицами для стен.

И ещё мы установим точки старта и финиша:

start = 1, 1
end = 2, 5

Итак, лабиринт готов, смотрите:

Точки начала и завершения пути в лабиринте
Точки начала и завершения пути в лабиринте

Алгоритм

Алгоритм для прохождения по лабиринту следующий:

  • Создаём нулевую матрицу подходящего размера.
  • Ставим 1 в точку старта.
  • Во все позиции вокруг 1 ставим 2 , если нет стены.
  • Вокруг двоек ставим тройки ( 3). Тоже, если нет стены.
  • И так далее…
  • Как только ставим цифру в точку финиша, останавливаемся. Это число и является минимальной длиной пути.

Создаём матрицу

Это просто. Возможно, есть функция по типу нулей или что-то подобное, но я знаю только один способ. Итак, создаем матрицу вручную и устанавливаем точку старта:

Получаем следующую матрицу:

Рассчитываем шаг

Теперь создадим функцию только для одного шага:

Она принимает число шагов k в качестве аргумента. Функция выполняет очень простые вещи:

  • Сканирует матрицу при помощи цикла for.
  • Если находится число, которое соответствует количеству шагов k , смотрим на ячейки вокруг и проверяем:
    1. Нет ли здесь пока еще числа.
    2. Нет ли здесь стены.
    И ставим k+1 этим ячейкам.

Если запустить эту функцию 8 раз, получится вот что:

Получаем следующую матрицу:

Она соответствует такому изображению:

Первые 8 шагов
Первые 8 шагов

Давайте продолжим, как и делали, пока не будет заполнена точка финиша:

k = 0
while m[end[0]][end[1]] == 0:
k += 1
make_step(k)

Теперь у нас будет вот такая матрица:

Лабиринт по ней будет выглядеть вот так:

Поиски точки
Поиски точки

Что такое путь?

Задача теперь — найти кратчайший путь по этой матрице.

Шаги для решения следующие:

  • Пойти в точку финиша, допустим, число здесь — k.
  • Найти соседнюю ячейку со значением k-1 , пойти туда, уменьшить k на единицу.
  • Повторить предыдущий шаг, пока не доберемся до начальной точки, а именно: k=1.

И теперь у нас есть координаты пути:

[(2, 5), (2, 6), (2, 7), (2, 8), (3, 8), (4, 8), (5, 8), (6, 8), (7, 8), (7, 7), (7, 6), (6, 6), (6, 5), (6, 4), (6, 3), (6, 2), (6, 1), (5, 1), (4, 1), (3, 1), (2, 1), (1, 1)]

И вот как это выглядит:

Результат
Результат

Лабиринт посложнее

Теперь попробуем, как сработает наш алгоритм в других лабиринтах.

Для начала немного видоизменим лабиринт:

-6

И потом сделаем его больше:

-7

Надеюсь, вам понравилось!

Чтобы визуализировать самостоятельно, как на картинках выше, установите библиотеку Pillow и вперёд:

Я не планировал делиться подробным кодом, так что, возможно, всё выглядит немного неясно. Идея была в том, чтобы визуализировать алгоритм, не показывая, как именно это было сделано.

Читайте также:

Читайте нас в Telegram, VK

Перевод статьи Dr Pommes: Solve a Maze with Python