對比DFS BFS求連通塊問題

2021-10-08 04:09:07 字數 2181 閱讀 8658

許多連通塊問題既可以用bfs求解也可以用dfs求解,兩者各有優缺點。

bfs求解:可以求出最短路或者判斷兩者是否連通,不存在爆棧的風險,但空間相對用的多一些而且**相對來說繁瑣一些。

dfs求解:dfs**簡潔,相對好寫一些,但存在爆棧的風險,而且不能求出最短路。

acwing 1112. 迷宮

一天extense在森林裡探險的時候不小心走入了乙個迷宮,迷宮可以看成是由 n∗n 的格點組成,每個格點只有2種狀態,.和#,前者表示可以通行後者表示不能通行。

同時當extense處在某個格點時,他只能移動到東南西北(或者說上下左右)四個方向之一的相鄰格點上,extense想要從點a走到點b,問在不走出迷宮的情況下能不能辦到。

如果起點或者終點有乙個不能通行(為#),則看成無法辦到。

注意:a、b不一定是兩個不同的點。

輸入格式

第1行是測試資料的組數 k,後面跟著 k 組輸入。

每組測試資料的第1行是乙個正整數 n,表示迷宮的規模是 n∗n 的。

接下來是乙個 n∗n 的矩陣,矩陣中的元素為.或者#。

再接下來一行是 4 個整數 ha,la,hb,lb,描述 a 處在第 ha 行, 第 la 列,b 處在第 hb 行, 第 lb 列。

注意到 ha,la,hb,lb 全部是從 0 開始計數的。

輸出格式

k行,每行輸出對應乙個輸入。

能辦到則輸出「yes」,否則輸出「no」。

資料範圍

1≤n≤100
輸入樣例:

2

3.##..#

#..00

225.

....

###.#

..#.

.###...

..#.00

40

輸出樣例:

yes

no

通過以下**的對比,顯而易見,dfs更短,而且時間上基本相同。

//bfs實現

#include

#include

#include

#include

#define x first

#define y second

using

namespace std;

typedef pair<

int,

int> pii;

const

int n =

110;

int n;

char g[n]

[n];

bool st[n]

[n];

int xa, ya, xb, yb;

int dx=

, dy=

;bool

bfs())

; st[xa]

[ya]

=true

;while

(q.size()

)); st[a]

[b]=

true;}

if(st[xb]

[yb]

==true

)return

true;}

return

false;}

intmain()

return0;

}

//dfs實現

#include

#include

#include

using

namespace std;

const

int n =

110;

int xa, ya, xb, yb;

int n;

bool st[n]

[n];

char g[n]

[n];

int dx[4]

=, dy[4]

=;bool

dfs(

int x,

int y)

return

false;}

intmain()

return0;

}

dfs求連通塊

遞迴是什麼?絕大部分人都會說 自己呼叫自己,剛開始我也是這樣理解遞迴的。確實沒錯,遞迴的確是自己呼叫自己。遞迴簡單的應用 編寫乙個能計算斐波那契數列的函式,也就是這樣 int fac int n 相信絕大部分人都能看懂這段 遞迴除了可以用自己呼叫自己這樣描述之外,還可以這樣表示遞迴函式 遞推式 邊界...

BFS 求連通塊的數目

有一間長方形的房子,地上鋪了紅色 黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰 上下左右四個方向 的黑色瓷磚移動。請寫乙個程式,計算你總共能夠到達多少塊黑色的瓷磚。分析 1.特點是把從起點出發能到達的點全部放入佇列中,每個點只能入隊一次,出隊的時候將數目加一。就可以統計所有點連通...

連通塊 島問題 總結

給出乙個mxn 的矩陣,矩陣中的元素為0或1。稱位置 x,y 與其上下左右四個位置 x,y 1 x,y 1 x 1,y x 1,y 是相鄰的。如果矩陣中有若干個1是相鄰的 不必兩兩相鄰 那麼稱這些1構成了乙個 塊 求給定的矩陣中 塊 的個數。0 1 1 1 0 0 1 0 0 1 0 0 0 0 0...