2016-04-13 353 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×迷宮:

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

如果你想要一個「更漂亮」的迷宮,你可以簡單地在迷宮的邊界添加完整的牆壁