bfs相對於dfs來說,並不是一條路走到黑,不撞南牆不回頭,而是對於每一層的所有情況都遍歷一次才進入下一層。也就是說bfs更側重於每一層的可能性,而不是每個選擇的可能性。
對於二叉樹的遍歷來說,遍歷完一層才會進入下一層。
c++中實現方法往往是使用乙個佇列,先將起點元素push進去,然後再去遍歷該元素的子元素,再將它pop出去,將他們的子元素依次push到佇列中,再重複相同的過程,這樣就能實現只有遍歷完父節點才能去索引子節點。
這種演算法通常用來保證結果的完整性,用於解決問題答案大多聚集在淺層的問題。
對於如下例題:
有乙個n*m的棋盤(1< n,m<=400),在某個點上有乙個馬,要求你計算出馬到達棋盤 上任意乙個點最少要 走幾步。
輸入:一行四個資料,棋盤的大小和馬的座標。
輸出:乙個n*m的矩陣,代表馬到達某個點最少要走幾步(左對齊,寬5格,不能到達則輸 出-1。
樣例:輸入:
3 3 1 1
輸出
0 3 2
3 -1 1
2 1 4
除了實現方法不同,處理方法與dfs是類似的,都要去判斷座標的合法性,然後進行下一步的遍歷,注意遍歷的終點是序列中的元素為空(表示均已遍歷完)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
class
node
;int n,m;
int x,y;
int dx[8]
=;int dy[8]
=;int dist[
500]
[500];
bool vis[
500]
[500];
queue q;
intmain()
} dist[x]
[y]=0;
memset
(vis,
false
,sizeof
(vis));
node temp;
temp.x = x;
temp.y = y;
vis[x]
[y]=
true
; q.
push
(temp)
;while
(!q.
empty()
)else
temp.x = newx;
temp.y = newy;
q.push
(temp)
; vis[newx]
[newy]
=true
; dist[newx]
[newy]
= dist[nx]
[ny]+1
;}}}
for(
int i =
0;i< n;i++
) cout<}return0;
}
4 17部落格(廣度優先搜尋和深度優先搜素)
這週講了搜尋演算法。相比於單純的列舉演算法有了一定的方向性和目標性。演算法是在解的空間裡,從乙個狀態轉移 按照要求拓展 到其他狀態,這樣進行下去,將解的空間中的狀態遍歷,找到答案 目標的狀態 搜尋演算法分為廣度優先搜尋 bfs 和深度優先搜尋 dfs 廣度優先搜尋 基本思想 從初始狀態 s 開始,利...
BFS廣度優先搜尋
廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...
bfs廣度優先搜尋
這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...