廣度優先搜尋bfs

2021-07-16 06:24:27 字數 1784 閱讀 6439

bfs即廣度優先搜尋演算法,其是搜尋演算法中的一種。

1. dfs常用於尋找是否存在解:

其從a節點出發,選取乙個臨近點b,然後不斷深入,在搜尋完b的下屬節點(ehif)後,回到a再搜尋臨近a的c節點,以此類推。

2. bfs則用於在最短的時間或最少的移動距離內找到解:

其往往從a節點出發,搜尋周圍所有的圍繞節點(bcd),然後再搜尋所有圍繞節點的臨近圍繞節點(efgk),故bfs常常會超記憶體。

acm中搜尋演算法常常表現為迷宮搜尋。

即在二維陣列中告訴你初始座標和最終目標,讓你求最短的到達時間,每單位時間只能移動一格,在迷宮中往往還有障礙或消耗時間的東西。

在解決bfs迷宮問題中,因為其是以初始節點為中心,一層一層的去遍歷,所以需要儲存節點之間的順序,讓臨近層比稍遠的層先搜尋到。

所以需要用到佇列,詳見下圖:

c++的標準庫中提供了佇列queue:

1. 引入標頭檔案:

#include

using namespace std;

2. 佇列定義:

queue《資料型別名》 變數名;

3. 佇列的有關函式:

empty():判斷佇列是否為空,當隊列為空時返回1

push():  將乙個元素置入佇列末尾

front():   返回佇列的首元素(也就是第乙個被置入的元素)

pop():    從佇列中刪除首元素

用以上這四個便可以做bfs的迷宮題

下面直接引出bfs一般的模板:

#include#include#includeusing namespace std;

struct place 定義乙個結構體,儲存座標和時間

abc,xyz; 開兩個結構體abc,xyz(abc表示舊座標,xyz表示由舊座標通過方向陣列產生的新座標)

queuep; 定義乙個struct place型佇列

int 行數,列數; 全域性變數,表示地圖大小

char map[100][100] 地圖,一般大小不超過100*100

int vis[100][100] 用於標記該位置是否已走過

int dir[4][2]=,,,} 方向陣列,分別表示向上,向下,向左,向右

void bfs() 進入bfs

for(i=0;i<4;i++) 迴圈周圍四個方向}}

}int main()

這裡可能需要吃回車

}abc.x=abc.y=1; 初始位從(1,1)開始,也可以變為讀入初始座標

abc.t=0; 在(1,1)時,因為還沒開始行動,所以耗時為0

p.push(abc); 將初始位壓入佇列

bfs(); 從初始位開始廣度優先搜尋

while(!p.empty()) 清空佇列,否則影響下一組輸入

p.pop();

}return 0;

}

當然,如果把佇列的定義放入bfs函式內(即queue成為區域性變數),這樣可能具有更高的效率,因為這樣就不用每次都清空佇列了。

BFS廣度優先搜尋

廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...

bfs廣度優先搜尋

這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...

廣度優先搜尋(BFS)

題目 給出乙個m x n的矩陣,矩陣中的元素為0或1。稱位置 x,y 與其上下左右四個位置 x,y 1 x,y 1 x 1,y x 1,y 是相鄰的。如果矩陣中有若干個1是相鄰的 不必兩兩相鄰 那麼稱這些1構成了乙個 塊 求給定矩陣中 塊 的個數。0 1 1 1 0 0 1 0 0 1 0 0 0 ...