1. 程式人生 > >BFS+優先佇列——迷宮最短路徑——兩種最優方法比較及詳細圖解

BFS+優先佇列——迷宮最短路徑——兩種最優方法比較及詳細圖解

http://blog.csdn.net/qq_36523667/article/details/78638354

這個連結裡是一道迷宮題。用到了BFS+優先佇列。

我一直百思不得其解優先佇列到底優先在哪了?我感覺和直接bfs沒啥區別?後來證明做法不一樣,思路也不一樣。

所以這裡引出另一種最優的做法。

正常的bfs


黑色是當前的點,黃色是即將探索的點,把黃色的依次入佇列,再依次出佇列,一次出一個。

假設你先出的是右邊那個點。

那麼右邊的點的右邊,下邊都會到佇列的最後。再出第二個黃色點,第二個黃色的下面的點入佇列(因為右邊的點已經入了),加入到最後面,依次出。

優先佇列+BFS


(假設3代表後入要多等待3秒,是一種不友好的情況)不管我們下面的那個黃點和3這個黃點哪個先入佇列,3都會被優先佇列內部的機制處理在佇列的最後端。

所以當你第一個黃點出佇列的時候,第一個黃點的右邊,下邊又會入佇列。

但是根據優先佇列的機制,新入的兩個點又會跑到3的前面。

所以我們這種做法是規避了比較耗時的操作,讓耗時的或者不友好的點最後出佇列,可能可以讓我們更快抵達終點。

而我的做法。



我是採用一種集體出發的模式,如第一個圖,我們兩個黃色即將探訪的區域,同時抵達。

把原來那個點置位灰色,代表已走過,把所有黑色點作為當前點,再找出所有將探訪的點。

就這樣一步一步全部像病毒一樣蔓延了出去,就算遇到了同上面例子講的情況3這種不友好低優先順序的點,

我也是一樣處理,不過會在3那個點停留3秒。

這樣的話是把所有可能的情況都走遍了。

上述bfs+優先佇列和我的方法,不能說誰更好。兩種方法適合的題型不一樣。