簡單易懂BFS

2021-09-11 17:27:12 字數 1718 閱讀 5527

廣度優先搜尋,又稱寬度優先搜尋,簡稱bfs

bfsbfsbf

sbfs

bfs從起點開始,優先搜尋離起點最近的點,然後由這個最近的點擴充套件其他稍近的點,這樣一層一層的擴充套件,就像水波擴散一樣。

b fs

bfsbf

s需要借助佇列來實現:

根據該思路可以得出乙個簡單的**框架:

void

bfs(起始點)}}

隊列為空,廣搜結束;

}

關於前面所提到的迷宮最短路問題,我們已經學會了使用dfs來求解。用dfs求解迷宮最短路有乙個很大的缺點,需要列舉所有可能的路徑,讀入的地圖一旦很大,可能的搜尋方案數量就會非常多,用dfs搜尋顯然效率會非常低。

我們可以借助bfs來求解迷宮遊戲。由於bfs是分層搜尋,因此,第一次搜尋到終點的時候,當前搜尋的層數就是最短路徑的長度

例1:題目: 迷宮遊戲 我們用乙個二維的字元陣列來表示前面畫出的迷宮:

s**. 

....

***t

其中字元s

ss表示起點,字元t

tt表示終點,字元∗

∗∗表示牆壁,字元.

..表示平地。你需要從s

ss出發走到t

tt,每次只能向上下左右相鄰的位置移動,不能走出地圖,也不能穿過牆壁,每個點只能通過一次。你需要程式設計來求解出從起點到終點的最短路徑

由於bfs求解要用到佇列,所有我們將點的位置設為乙個結構體,方便佇列存放:

struct node 

};

然後套用上述的bfs框架:

int

bfs(

int sx,

int sy)

else}}

}return-1

;}

完整實現:

#include

#include

#include

using namespace std;

int n,m;

string maze[

110]

;bool vis[

110]

[110];

int dir[4]

[2]=

,,,}

;bool in

(int x,

int y)

struct node };

intbfs

(int sx,

int sy)

else}}

}return-1

;}intmain()

int x, y;

for(

int i =

0; i < n;

++i)}}

cout <<

bfs(x, y)

;return0;

}

inp

ut

input

input:

5 6

…s*.

.….*….

.t…

out

pu

toutput

output

:

簡單易懂的BFS

bfs從起點開始,優先搜尋離起點最近的點,然後由這個最近的點擴充套件其他稍近的點,這樣一層一層的擴充套件,就像水波擴散一樣。bfs需要借助佇列來實現 初始的時候把起始點放入佇列中,並標記起點訪問 如果佇列不為空,從佇列中取出乙個元素x,否則演算法結束 訪問和x相連的所有點v,如果v沒有被訪問,把v入...

DFS與BFS的原理 簡單易懂 力扣例題

dfs 思想 一直往深處走,直到找到解或者走不下去為止 使用棧儲存未被檢測的結點。結點按照深度優先的次序被訪問並依次被壓入棧中,並以相反的次序出棧進行新的檢測。類似於樹的先根遍歷。例如 走迷宮,你沒有辦法用分身術來站在每個走過的位置,不撞南山不回頭。使用dfs解決問題時最先想到的應該是遞迴和棧 st...

javaWeb簡單易懂

武松 瀏覽器。酒館 伺服器。店小二 廚師 servlet或者jsp。來三碗好酒!瀏覽器向伺服器發出http請求。店小二上酒 伺服器的響應。武松從進店到離開 乙個http對話。我們可以看到,web互動的最基本單位為http請求 武松點菜 每個使用者從進入 到離開 這段過程稱為乙個http會話 武松進店...