<?php
// maze generation, random dfs
// generate maze
function print2d($array) {
foreach($array as $row) {
foreach($row as $col) {
echo $col . ' ';
}
echo "\n";
}
echo "\n\n";
}
function isGoodPath($maze, $point) {
if (!isset($maze[$point[0]][$point[1]]) ) return false;
$dirs = [
[0,-1],
[1,0],
[0,1],
[-1,0],
];
$countPath = 0;
foreach($dirs as $dir) {
$newPoint = [$point[0] + $dir[0], $point[1] + $dir[1]];
if (
isset($maze[$newPoint[0]][$newPoint[1]]) && $maze[$newPoint[0]][$newPoint[1]] == '.'
) {
$countPath++;
}
}
if ($countPath > 1)
return false;
return true;
}
function generateMaze(&$maze, $point) {
$dirs = [
[0,-1],
[1,0],
[0,1],
[-1,0],
];
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;
}
$size = 25;
print2d(generateMaze($maze, [0, 0]));
PD9waHAKCi8vIG1hemUgZ2VuZXJhdGlvbiwgcmFuZG9tIGRmcwoKCgovLyBnZW5lcmF0ZSBtYXplCmZ1bmN0aW9uIHByaW50MmQoJGFycmF5KSB7CiAgICBmb3JlYWNoKCRhcnJheSBhcyAkcm93KSB7CiAgICAgICAgZm9yZWFjaCgkcm93IGFzICRjb2wpIHsKICAgICAgICAgICAgZWNobyAkY29sIC4gJyAnOwogICAgICAgIH0KICAgICAgICBlY2hvICJcbiI7CiAgICB9CgogICAgZWNobyAiXG5cbiI7Cn0KCgpmdW5jdGlvbiBpc0dvb2RQYXRoKCRtYXplLCAkcG9pbnQpIHsKICAgIGlmICghaXNzZXQoJG1hemVbJHBvaW50WzBdXVskcG9pbnRbMV1dKSApCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICRkaXJzID0gWwogICAgICAgIFswLC0xXSwKICAgICAgICBbMSwwXSwKICAgICAgICBbMCwxXSwKICAgICAgICBbLTEsMF0sCiAgICBdOwoKICAgICRjb3VudFBhdGggPSAwOwogICAgZm9yZWFjaCgkZGlycyBhcyAkZGlyKSB7CiAgICAgICAgJG5ld1BvaW50ID0gWyRwb2ludFswXSArICRkaXJbMF0sICRwb2ludFsxXSArICRkaXJbMV1dOwogICAgICAgIGlmICgKICAgICAgICAgICAgaXNzZXQoJG1hemVbJG5ld1BvaW50WzBdXVskbmV3UG9pbnRbMV1dKSAmJgogICAgICAgICAgICAkbWF6ZVskbmV3UG9pbnRbMF1dWyRuZXdQb2ludFsxXV0gPT0gJy4nCiAgICAgICAgKSB7CiAgICAgICAgICAgICRjb3VudFBhdGgrKzsKICAgICAgICB9CgogICAgfQoKICAgIGlmICgkY291bnRQYXRoID4gMSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgcmV0dXJuIHRydWU7Cgp9CgpmdW5jdGlvbiBnZW5lcmF0ZU1hemUoJiRtYXplLCAkcG9pbnQpIHsKICAgICRkaXJzID0gWwogICAgICAgIFswLC0xXSwKICAgICAgICBbMSwwXSwKICAgICAgICBbMCwxXSwKICAgICAgICBbLTEsMF0sCiAgICBdOwoKICAgIHNodWZmbGUoJGRpcnMpOwoKICAgIGZvcmVhY2goJGRpcnMgYXMgJGRpcikgewogICAgICAgICRuZXdQb2ludCA9IFskcG9pbnRbMF0gKyAkZGlyWzBdLCAkcG9pbnRbMV0gKyAkZGlyWzFdXTsKCiAgICAgICAgaWYgKGlzR29vZFBhdGgoJG1hemUsICRuZXdQb2ludCkpIHsKICAgICAgICAgICAgJG1hemVbJG5ld1BvaW50WzBdXVskbmV3UG9pbnRbMV1dID0gJy4nOwogICAgICAgICAgICBnZW5lcmF0ZU1hemUoJG1hemUsICRuZXdQb2ludCk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkbWF6ZTsKfQoKCiRzaXplID0gMjU7CiRtYXplID0gYXJyYXlfZmlsbCgwLCAkc2l6ZSwgYXJyYXlfZmlsbCgwLCAkc2l6ZSwgJyMnKSk7CgpwcmludDJkKGdlbmVyYXRlTWF6ZSgkbWF6ZSwgWzAsIDBdKSk7