當老師教完類這一章,就給我們布置了幾個實驗,其中乙個就是迷宮問題,屬於其中最難的乙個實驗了,這乙個實驗也折騰我好幾個禮拜,然而對於班上的幾個大神,這個也就是個小case了,對於菜鳥的我,花了我好幾個禮拜,也終於在最近給完成了。
為了生成乙個迷宮,當然用陣列表示是最好的了,我是基於深度優先演算法用棧生成乙個迷宮陣列,深度優先的基本思想就是把初始點給標記為已訪問併入棧,然後尋找該點的鄰居節點,如果它的鄰居節點沒有訪問過並且存在,就把鄰居節點入棧並標記為已訪問,當存在鄰居節點時,就一直執行上面的步驟,當不存在未訪問的鄰居節點時,就出棧乙個節點,並以當前棧頂元素繼續訪問它的未訪問過的鄰居節點,執行前面相同的步驟。它的終止條件就是棧為空時,也就訪問完了所有節點。為了生成乙個迷宮陣列,需要注意幾點:
一是迷宮有牆,這就需要在訪問鄰居節點時中間的隔乙個元素當作牆。
二是要隨機生成乙個方向來訪問,這樣每次生成的迷宮就不一樣了。
三是隨機訪問乙個方向時,最好標記該方向已訪問過。至於尋找路徑也是相同的思想。
下面是主要的**:
dfs演算法生成迷宮:
1public
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演算法尋找迷宮出口:
1public
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...