寬度優先搜尋(bfs,breadth-first search)也是搜尋的手段之一,與深度優先搜尋類似,從某個狀態出發搜尋所有可以到達的狀態。
與深度優先搜尋的不同之處在於搜尋的順序,寬度優先搜尋總是先搜尋距離初始狀態最近的狀態。也就是說,它是按照開始狀態→只需一次轉移就能到達的所有狀態→只需2次就可以到達的所有狀態→…按照這樣的順序進行搜尋。對於同乙個狀態,寬度優先搜尋只經過一次,因此時間複雜度為o(狀態數×轉移的方式)。
深度優先搜尋利用了棧進行計算,而寬度優先搜尋則利用了佇列進行計算。搜尋時首先將狀態新增進佇列裡,此後從佇列的最前端不斷取出狀態,把從該狀態可以轉移到的狀態尚未訪問過的部分加入到佇列中,如此往復,直至佇列被取空或找到了問題的解。通過觀察這個佇列,我們就可以知道所有的狀態都是按照距初始狀態由近及遠的順序遍歷的。
例題:迷宮的最短路徑
給定乙個大小為n×m的迷宮。迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四個的通道移動。請求出從起點到終點所需的最小步數。請注意,本題假定從起點一定可以移動到終點。(n,m≤100)('#',
'.' , 's', 'g'分別表示牆壁、通道、起點和終點)
輸入:10 10
#s######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...g#
輸出:22
1 #include 2 #include 3 #include 4 #include 5 #include 6#define n 105
7#define inf 1000000000
8using
namespace
std;
9int dir[4][2]=,,,};
10char
k[n][n];
11int
vis[n][n];
12int
n,m;
13int
px,py,nx,ny;
14 typedef pairp;
15 queueq;
16int
bfs()
22for(int i=0;i<4;i++)29}
30}31return
vis[nx][ny];32}
33int
main()
46q.push(p(px,py));
47 vis[px][py]=0
;48 printf("
%d\n
",bfs());
49return0;
50 }
BFS 迷宮的最短路徑
迷宮的最短路徑 給定乙個大小為n m的迷宮。迷宮由通道和牆壁組成,每一步可以 向鄰接的上下左右四個方位的通道移動,請求出從起點到終點所需的最小不熟。此題假設一定能從起點到終點 限制條件 n,m 100 樣例 輸入 10 10 s g 輸出 22 include include includeusin...
迷宮的最短路徑 bfs
給定乙個大小為n m的迷宮,由通道 和牆壁 組成,其中通道s表示起點,通道g表示終點,每一步移動可以達到上下左右中不是牆壁的位置。試求出起點到終點的最小步數。本題假定迷宮是有解的 n,m 100 樣例輸入 樣例輸出 include include include using namespace st...
BFS 迷宮的最短路徑
迷宮的最短路徑 給定乙個大小為n m 的迷宮。迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四格的通道移動。請求出從起點到終點所需的最小步數。請注意,本題假定從起點一定可以移動到終點 限制條件 n m 100 s g 分別代表 牆壁 通道 起點和終點。sample input 10 10 s g ...