廣度優先搜尋主要用於解決求最短問題,如最短路徑,最少變化步數問題等等,思想是從起點出發,按層遍歷,直到搜尋到目標或者已經搜尋完全部區域。通常利用佇列實現廣度優先搜尋,我這裡使用的雙佇列法,用乙個佇列cur表示當前層,next表示由當前層擴充套件的下一層,用雙佇列有個好處是我們只需要定義乙個全域性變數level就能記錄擴充套件的層數(即路徑長度),如果要求輸出具體最短路徑的話,我們還需要利用乙個unordered_map物件來儲存路徑樹,為了避免搜尋重複節點,我們需要標記已經搜尋過的狀態,這裡利用unordered_set物件來儲存已經搜尋過的狀態(注意如果unordered_map或unordered_set儲存的是自定義的結構體時,我們需要自己定義==操作符合hash函式);我們還需要乙個變數isfinsh來標記是否已經搜尋到目標。
下面用乙個具體的例子來說明廣度優先搜尋雙佇列程式設計模板的使用:
具體實現的程式如下:
#include "stdafx.h"
#include #include #include #include #include using namespace std;
typedef struct node
; bool operator==(const node &rhs) const
;}state;
struct hash_func //自定義的hash 函式
};
//根據father儲存的路徑樹得到具體路徑
void findpath(vector> &result,unordered_map&father,state start,state child)
; vectortmpresult(tmppoint,tmppoint+2);
result.push_back(tmpresult);
tmpstate=father[tmpstate];
} int tmppoint[2]=;
vectortmpresult(tmppoint,tmppoint+2);
result.push_back(tmpresult);
reverse(result.begin(),result.end());
}vector> bfs(vector> &map,int &step,state &start,state &end)
if (start.x==end.x && start.y==end.y)
int row=map.size();
int col=map[0].size();
int extend[4][2]=,,,}; //按右-下-左-上順時針方向擴充套件狀態
//用於標記已經擴充套件過的狀態,此處也可以利用乙個二維bool陣列,但是為了更具一般性,此處採用unordered_set
//注意:要使用unordered_set,unordered_map,node需要有定義的==運算子和hash函式。
unordered_setselected;
unordered_mapfather;//用於記錄路徑樹
queuecur; //用於儲存當前層的狀態
queuenext; //儲存由cur擴充套件出的下一層狀態
int level=0; //用於標記擴充套件的層數,可用於求最短路徑長度
bool isfinish=false; //標記搜尋是否結束
雙端佇列廣度優先搜尋
在乙個邊權只有0 1的無向圖中搜尋最短路徑可以使用雙端佇列進行bfs。其原理是當前可以擴充套件到的點的權重為0時,將其加入隊首 權重為1時,將其加入隊尾。達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。翰翰的家裡有一輛飛行車。有一天飛行車的電路板突然出...
演算法 廣度優先演算法通用模板
廣度優先演算法和深度優先演算法類似是較為優雅的暴力演算法,時間複雜度為o n 2 定義queue 加入初始條件 佇列不為空的while迴圈 3.0 業務處理 3.1 for迴圈將佇列元素逐一取出進行處理 3.2 將下一條件放入佇列中 3.3 將符合條件的一種結果放入結果集中 返回結果集 接下來用le...
程式設計思維 A Maze(廣度優先搜尋)
東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。input 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。outpu...