简单实现迷宫生成方法(随机DFS)

时间:2016-04-13 07:57:47

标签: java php recursion depth-first-search maze

在一次采访中,我的采访者问我这个问题:

  

开发一个生成随机迷宫的函数

如果你之前没有解决过这个问题,这是一个很难在30分钟内解决的问题。在互联网上有很多解决方案,但似乎没有一个容易。该方法应该遵守这个约束:

  • 它应该接受迷宫的大小(方形迷宫NxN)
  • 它应该只包含Walls和Path
  • 为简单起见,算法不需要设置条目和退出

我会用解决方案发布答案​​,以便其他人能够找到这个问题。

生成的迷宫示例:

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

1 个答案:

答案 0 :(得分:3)

可以使用简单的随机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()的一个很好的实现。这个函数只是检查新路径是否在迷宫内,以及我们是否可以移除墙壁(也就是说我们不能有两个平行的相邻&# 34;免费"路径)

您可以在此处运行完整实施:https://ideone.com/oufifB

25x25的迷宫:

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

如果你想要一个更漂亮的"迷宫你可以简单地在迷宫的边界添加整个墙壁