BFS廣度優先搜素

2021-10-19 18:56:39 字數 1658 閱讀 6629

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 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...