洛谷P1141 01迷宮

2021-10-21 20:34:21 字數 1716 閱讀 4387

問題重述:

有乙個僅由數字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用來...