問題重述:
有乙個僅由數字0與1組成的n×n格迷宮,你每次可以移動到與自身不一樣的格仔上,問你每個連通塊有多少格。
思考:
搜尋題,找連通塊以及記錄大小,可以用bfs或者dfs來做,但是要注意dfs要用記憶化搜尋,否則會超時。(流下了不會記憶化的淚水qaq)
兩種寫法對比:
可以看到dfs更快,**量更少,但是bfs思考起來更簡單,兩種方法各有利弊。
bfs寫法:
用佇列廣搜,邊搜邊用動態陣列記錄塊的資訊,搜完遍歷將結果賦給動態陣列內位置值。
#include
using
namespace std;
char a[
1005][
1005];
int b[
1005][
1005];
int c[
1005][
1005];
int x2[4]
=;int y2[4]
=;struct sa
;int n,m;
void
bfs(
int dx,
int dy));
while
(!q.
empty()
)); cnt++
; b[x]
[y]=1;
}}} vector
::iterator it;
for(it=p.
begin()
;it!=p.
end();
++it)
}int
main()
else
printf
("%d\n"
,c[dx]
[dy]);
}return0;
}
dfs寫法:
用f陣列標記連通塊個數,cnt記錄是第幾種連通塊,vis記錄是否訪問過該位置。
注意ans陣列一定要大!大!大!(流下了re的淚水)。
1000*1000開1e6合適。
#include
using
namespace std;
const
int n=
1100
;char a[n]
[n];
int vis[n]
[n],f[n]
[n];
int x2[5]
=;int y2[5]
=;int ans[
1000005
],n,m,cnt,p;
void
dfs(
int x,
int y)}}
intmain()
}for
(int i=
1;i<=n;i++)}
}int x,y;
for(
int i=
1;i<=m;i++
)return0;
}
最近在複習搜尋,發現啥也不會了t a 洛谷 P1141 01迷宮
題目描述 有乙個僅由數字0與1組成的n n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 包含自身 輸入輸出格式 輸入格式 輸入的第1行為兩個正整數n,m。...
洛谷P1141 01迷宮
01迷宮 問題描述 有乙個僅由數字0與1組成的n n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 包含自身 分析 bfs,對於每個連通的格仔答案都是一樣的...
洛谷P1141 01迷宮
include using namespace std struct node a 1000001 char map 1001 1001 map是地圖 int n,m,startx,starty,num,book 1001 1001 mark 1001 1001 ans 1000001 book用來...