廣度優先搜尋,又稱寬度優先搜尋,簡稱bfs
bfsbfsbf
sbfs
bfs從起點開始,優先搜尋離起點最近的點,然後由這個最近的點擴充套件其他稍近的點,這樣一層一層的擴充套件,就像水波擴散一樣。
b fs
bfsbf
s需要借助佇列來實現:
根據該思路可以得出乙個簡單的**框架:
void
bfs(起始點)}}
隊列為空,廣搜結束;
}
關於前面所提到的迷宮最短路問題,我們已經學會了使用dfs來求解。用dfs求解迷宮最短路有乙個很大的缺點,需要列舉所有可能的路徑,讀入的地圖一旦很大,可能的搜尋方案數量就會非常多,用dfs搜尋顯然效率會非常低。
我們可以借助bfs來求解迷宮遊戲。由於bfs是分層搜尋,因此,第一次搜尋到終點的時候,當前搜尋的層數就是最短路徑的長度
例1:題目: 迷宮遊戲 我們用乙個二維的字元陣列來表示前面畫出的迷宮:由於bfs求解要用到佇列,所有我們將點的位置設為乙個結構體,方便佇列存放:其中字元ss**.
....
***t
ss表示起點,字元t
tt表示終點,字元∗
∗∗表示牆壁,字元.
..表示平地。你需要從s
ss出發走到t
tt,每次只能向上下左右相鄰的位置移動,不能走出地圖,也不能穿過牆壁,每個點只能通過一次。你需要程式設計來求解出從起點到終點的最短路徑
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 6out…s*.…
.….*….
.t…
pu
toutput
output
:
簡單易懂的BFS
bfs從起點開始,優先搜尋離起點最近的點,然後由這個最近的點擴充套件其他稍近的點,這樣一層一層的擴充套件,就像水波擴散一樣。bfs需要借助佇列來實現 初始的時候把起始點放入佇列中,並標記起點訪問 如果佇列不為空,從佇列中取出乙個元素x,否則演算法結束 訪問和x相連的所有點v,如果v沒有被訪問,把v入...
DFS與BFS的原理 簡單易懂 力扣例題
dfs 思想 一直往深處走,直到找到解或者走不下去為止 使用棧儲存未被檢測的結點。結點按照深度優先的次序被訪問並依次被壓入棧中,並以相反的次序出棧進行新的檢測。類似於樹的先根遍歷。例如 走迷宮,你沒有辦法用分身術來站在每個走過的位置,不撞南山不回頭。使用dfs解決問題時最先想到的應該是遞迴和棧 st...
javaWeb簡單易懂
武松 瀏覽器。酒館 伺服器。店小二 廚師 servlet或者jsp。來三碗好酒!瀏覽器向伺服器發出http請求。店小二上酒 伺服器的響應。武松從進店到離開 乙個http對話。我們可以看到,web互動的最基本單位為http請求 武松點菜 每個使用者從進入 到離開 這段過程稱為乙個http會話 武松進店...