Простая реализация метода генерации лабиринта (произвольная DFS)

В интервью мой интервьюер задал мне этот вопрос:

Разработайте функцию генерации случайного лабиринта

Это довольно сложный вопрос, который нужно решить за 30 минут, если вы еще не решили этот вопрос. В Интернете есть много решений, но ни один из них не кажется простым. Метод должен уважать это ограничение:

  • он должен принять размер лабиринта (квадратный лабиринт NxN)
  • он должен состоять только из Стены и Пути
  • чтобы сделать его простым, алгоритму не нужно устанавливать запись и выход

Я отправлю ответ с помощью решения, чтобы другие люди смогли найти этот вопрос.

Пример сгенерированного лабиринта:

. # # . # . . . . . . . . . . . # # # . # . # # # # . . . . . # . . . . # . # . . # . # # . # . # . . # . # . . # . . # . . . # . # . # . . . # . # . . . # # . # . . . # . # . . . . . # . # . . . # . 

Простую рандомизированную DFS можно использовать для создания лабиринта. Для запуска лабиринта с полной стеной инициализируется размер NxN, затем эта функция пересекает лабиринт и добавляет путь, когда это возможно:

 function generateMaze(&$maze, $point) { $dirs = [ [0,-1], [1,0], [0,1], [-1,0], ]; shuffle($dirs); foreach($dirs as $dir) { $newPoint = [$point[0] + $dir[0], $point[1] + $dir[1]]; if (isGoodPath($maze, $newPoint)) { $maze[$newPoint[0]][$newPoint[1]] = '.'; generateMaze($maze, $newPoint); } } return $maze; } 

Ключом к решению этой проблемы является хорошая реализация функции isGoodPath() эта функция просто проверяет, находится ли новый путь внутри лабиринта, и если мы можем удалить стены (то есть мы не можем иметь два параллельных соседних «свободного» пути)

Вы можете выполнить полную реализацию здесь: https://ideone.com/oufifB

Лабиринт 25×25:

 # . . # . . . # . . . . . # . . . . . . . # . # . . # . # # # . . . # # # . . # # . # # # . . . . . . # . . . . # . # . . . # . . . # . . . . # . # . . . # # # . # . . # . # # # # . . . # # . # . . # . # . . # . . # . # . . # . # # # # . . # . # . . . . # . # # . # . . # . . . . . . # . # . . . # . # . . . . # . . # . . # . # . # # . . . . # # . . . . # # . . # . . # . # . # . . . . # # . . # . # . # . . # . # . # . . # . . # # . # . . # . # . . . . . # . . # . . . # . . # . # . # . # . . . # . # # . # . # . # # # . # # . . . . # . # . # # . . . . . # . . . . . . . . # . # # # # . . . # # . # # # # . . # # # # . # . . . # . . . . # # . . . # . . . # # . . . . # # . # . # . # # # # # . # # . . # . . . . # # . # . . # . # . . . . # . . # . . . . # . # # . . . . # # # . . # # # # . . # # # . # . . # . . . # # . . . . # . # . . . . # . # # . . # . . # . # . # # . # . . . # . # # # . . . . . . . # . . # . . . . # . # # . # . # . . # # . # . # . . # . . . # # . # . . . . # . . # . . . . # . . . # . . # # . # . . # # . # . # . . # . # # . . # . . . # . . . . # . . . # . . # # . # . # . # # # # . # . . # . # . # # . # # . . . . # . . . . . # . . . # # # . . . # # . . # # . # # . # # # # . . . # . . . . . # . . . # . . . . . . . . . . . . 

Если вы хотите «более красивый» лабиринт, вы можете просто добавить полные стены к границе лабиринта