關於用深度優先演算法生成迷宮與尋找路徑的一些回憶

2022-08-29 07:45:10 字數 1951 閱讀 6806

當老師教完類這一章,就給我們布置了幾個實驗,其中乙個就是迷宮問題,屬於其中最難的乙個實驗了,這乙個實驗也折騰我好幾個禮拜,然而對於班上的幾個大神,這個也就是個小case了,對於菜鳥的我,花了我好幾個禮拜,也終於在最近給完成了。

為了生成乙個迷宮,當然用陣列表示是最好的了,我是基於深度優先演算法用棧生成乙個迷宮陣列,深度優先的基本思想就是把初始點給標記為已訪問併入棧,然後尋找該點的鄰居節點,如果它的鄰居節點沒有訪問過並且存在,就把鄰居節點入棧並標記為已訪問,當存在鄰居節點時,就一直執行上面的步驟,當不存在未訪問的鄰居節點時,就出棧乙個節點,並以當前棧頂元素繼續訪問它的未訪問過的鄰居節點,執行前面相同的步驟。它的終止條件就是棧為空時,也就訪問完了所有節點。為了生成乙個迷宮陣列,需要注意幾點:

一是迷宮有牆,這就需要在訪問鄰居節點時中間的隔乙個元素當作牆。

二是要隨機生成乙個方向來訪問,這樣每次生成的迷宮就不一樣了。

三是隨機訪問乙個方向時,最好標記該方向已訪問過。至於尋找路徑也是相同的思想。

下面是主要的**:

dfs演算法生成迷宮:

1

public

class dfsgeneratestrategy implements

generatemazestrategy 14}

15}1617

@override

18public

int generate(int

size)

42 visitstatus.up = true;//

標記該方向已走過

43 } else

if (direction == direction.down)

50 visitstatus.down = true

;51 } else

if (direction == direction.left)

58 visitstatus.left = true

;59 } else

if (direction == direction.right)

66 visitstatus.right = true;67

}6869if (n == 0)

74 } else77}

78return

map;79}

8081

//判斷該點是否存在並訪問過

82private

boolean isvisted(int x, int

y) 86

return

true;87

}8889 }

dfs演算法尋找迷宮出口:

1

public

class dfssearchstrategy implements

searchpathstrategy else

if (array[stack.peek().x + 1][stack.peek().y] == blockstatus.open) else

if (array[stack.peek().x - 1][stack.peek().y] == blockstatus.open) else

if (array[stack.peek().x][stack.peek().y - 1] == blockstatus.open) else26}

27return getpathlocation(stack).toarray(new point[0]);28}

2930

//得到路徑座標

31private listgetpathlocation(stacksw)

37return

p;38

}39 }

完整專案已提交到碼雲:

隨機迷宮生成與尋路演算法(1)深度優先搜尋

接下來一段時間,想要研究下隨機迷宮生成演算法,打算在有空可時候偶爾更新一下這方面的學習過程。隨機迷宮的生成演算法有很多種,比如遞迴回溯,遞迴分割,隨機prime等等。今天是第一次嘗試隨機迷宮生成,就先試一下用遞迴的方法通過深度優先搜尋來生成隨機迷宮。首先我們來明確一下基本觀念,迷宮可以通過乙個二維陣...

隨機迷宮生成與尋路演算法(3)深度優先搜尋

該方法很容易理解 首先我們將迷宮的起始點入棧將棧頂元素標記為當前座標,然後按照已經定義好的方向陣列依序從上 下 左 右四個方向 方向可以是任意的,但沒必要每次都進行隨機選取 來遍歷當前座標的相鄰方塊如果這個取得的方塊是合法的 也即是說這個方塊不是邊界,不是障礙物,並且沒有標記為路線或者死胡同 則結束...

深度優先 迷宮演算法

前一陣一直想寫這個程式,一直沒有有效的解決儲存路徑的問題。現在想到的辦法是用佇列儲存每個節點的下表來表示路徑。這個演算法解決問的問題是 建乙個迷宮 用矩陣表示m行,n列 期中矩陣的左上角 座標為 0,0的點 為入點,找尋到所有到 m 1,n 1 的所有不重複路徑,並列印出來。注釋如下 include...