關於bfs的相關知識由於水平有限就不多說了,感興趣的可以自己去wiki或者其他地方查閱資料。
這裡大概說一下bfs尋路的思路,或者個人對bfs的理解:
大家知道astar的乙個顯著特點是帶有啟發函式,換句話說,astar嘗試以人的思維來去尋找一段路徑。而bfs則沒有這種聰明勁,他看起來更中規中矩,老實巴交,更像是機械人的風格。
簡單的說,bfs為了找到一條路徑,他從起點開始,然後是身邊的鄰居,然後是鄰居的鄰居,乙個乙個的搜查,直到搜到終點(尋路成功),或者把整個地圖搜尋完(除非最後乙個點就是終點,否則尋路失敗)。
可能乍看上去bfs真的比較笨,但是他也並沒有笨的不著邊際,因為他最多把整個地圖都搜一遍,這樣,對於一張有限的地圖,他尋找一段路徑所花的時間也是相對的有乙個上限。
但astar則不同,astar雖然看起來帶有聰明勁,但是這種聰明只是一種自作聰明,有時候,對於一些設計特殊的地圖,astar要為自己的聰明付出很大的代價。比如帶有半島的地圖。
總體上看,astar在障礙越少的情況下尋路越快,而bfs則比較平緩,不管障礙多少,他快慢幅度並不大。
廢話不多說,下面用**來說明bfs的思路:
public function tryfindpath(sx:int, sy:int, ex:int, ey:int):boolean
queue.enqueue(neighbor);}}
}return false;
}
_mapdata是對乙個二維網格地圖資料做了乙個封裝,包括設定起始點,終點,根據索引獲取節點等。
node是乙個節點物件,他有xy的屬性和乙個f屬性,跟astar的代價屬性類似。
queue是乙個最小堆,他保證f值越小的node物件越靠近佇列的頂部。
testednodes用來記錄節點是否被搜尋過。
其尋路過程為:
1,將起點放入佇列;
2,彈出佇列中的最小代價的節點,搜尋他周圍的有效節點(即存在,可走,而且沒有被檢查過),設定代價值,和父節點,如果這個節點就是終點,那麼尋路成功,否則將此節點放入佇列,在檢查下乙個鄰居節點,如果所有的鄰居節點都不是終點則進入3;
3,如果佇列空了,那麼說明所有的節點都檢查過了,沒有找到終點,否則繼續2。
bfs的這種平緩特性在有些時候看起來似乎可以彌補astar的缺陷,比如我們想在長程情況下採用bfs而短程的時候用astar,但是這並不總是合適的,因為astar並不是因為路程長才耗時,而是因為地形複雜,而地形複雜又沒有乙個可以衡量的指標,只能人為的去判斷,所以最多我們通過人為的配置來選擇尋路的方式。
迷宮尋路(bfs)
第一次寫部落格,希望能把基礎的演算法記錄下來,以後快要忘記了可以拿來複習。題目 輸入輸出要求 樣例 輸入樣例 8 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1...
C 實現A 尋路
網上有關a 演算法的文章已經非常豐富了,各種語言各種思路都有,本來我實在不想再寫一篇,但因為最近工作動盪因此專門抽空又看了一下,然後就想寫個文章防止以後印象模糊,好歹看自己寫的東西可以很快回憶起來。如果是初次接觸a 演算法的朋友可以先看看這篇參考文章,我這邊只是做乙個總結,然後先貼上我之前的筆記吧 ...
js實現A 尋路演算法
onload function cc.log this.searchroad map,0,0,4,4 傳入變數屬性,起始點座標和目標的座標。整個 執行後,列印出的是起始點到目標點最近路徑的座標 其中的map.arr是二維陣列 searchroad function map,start x,start...