2016-04-13 297 views
1

在接受采访时,我的面试官问我这个问题:简单实现一个迷宫生成方法(随机DFS)的

制定一个函数来生成随机迷宫

这是一个相当困难的如果您以前没有解决过这个问题,可以在30分钟内解决问题。在互联网上有很多解决方案,但没有一个看起来容易。该方法应该尊重这一限制:

  • 应该接受迷宫的大小(方形迷宫的N×N)
  • 应该只由墙壁和路径
  • ,使之简单,算法多恩斯t需要设置入口和出口

我将发布解决方案的答案,以便其他人将能够找到此问题。所产生的迷宫

实施例:

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

回答

3

一个简单的随机DFS可以用来生成迷宫。要启动一个完整的围墙迷宫被初始化为N×N的大小,那么这个函数穿越迷宫,并增加了只要不可能性的路径:

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×迷宫:

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

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