許多連通塊問題既可以用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...