你有一張某海域nxn畫素的**,".「表示海洋、」#"表示陸地,如下所示:
...
....
.##...
..##...
....
.##.
..####...
.###...
....
.
其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。
由於全球變暖導致了海面上公升,科學家**未來幾十年,島嶼邊緣乙個畫素的範圍會被海水淹沒。
具體來說如果一塊陸地畫素與海洋相鄰(上下左右四個相鄰畫素中有海洋),它就會被淹沒。
例如上圖中的海域未來會變成如下樣子:
...
....
....
....
....
....
....
....
.#....
....
....
....
請你計算:依照科學家的**,**中有多少島嶼會被完全淹沒。
【輸入格式】
第一行包含乙個整數n。 (1 <= n <= 1000)
以下n行n列代表一張海域**。
**保證第1行、第1列、第n行、第n列的畫素都是海洋。
【輸出格式】
乙個整數表示答案。
【輸入樣例】
7
...
....
.##...
..##...
....
.##.
..####...
.###...
....
.
【輸出樣例】
1準備工作:
錯誤思路:一開始沒認真讀題,被樣例誤導,然後雙重迴圈遍歷陣列mp,並判斷每乙個位置上下左右是否有任一方向為『.』,只要四個方向都不是『.』就不會被淹沒,count++。
wa了一遍發現我所求和題目根本不相符,其實存在乙個島嶼中有多個位置四個方向都是『#』的。
換句話說,題目所求可以分為兩步:
①在圖中有多少多個連通塊(島嶼)?
②哪些連通塊(島嶼)中存在乙個位置四邊相鄰的都是『#』.
正確思路:
從陣列mp開始遍歷,每遍歷到乙個未被訪問過的『#』,就開始dfs找相連的連通塊,並將連通塊都設為訪問過的狀態(使用陣列vis標記)。
並在邊搜尋時,判斷是否存在位置相鄰的四個方向皆為『#』,若存在則ans++,若乙個都不存在則ans等於0。
最後輸出ans值為0的個數,即為淹沒島嶼的個數。
#include
using
namespace std;
const
int maxn =
1005
;char mp[maxn]
[maxn]
;int vis[maxn]
[maxn]
;int ans[
100005];
int n;
void
dfs(
int x,
int y,
int cnt)
intmain()
}}int sum =0;
for(
int i =
0; i < len; i++)if
(ans[i]==0
) sum++
; cout << sum << endl;
}
藍橋杯 2023年第九屆真題 全球變暖 廣搜
你有一張某海域nxn畫素的 表示海洋 表示陸地,如下所示 其中 上下左右 四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。由於全球變暖導致了海面上公升,科學家 未來幾十年,島嶼邊緣乙個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰 上下左右四個相鄰畫素中有海洋 它就會被淹...
藍橋杯 2023年第九屆真題 搭積木
藍橋杯 2018年第九屆真題 搭積木 小明對搭積木非常感興趣。他的積木都是同樣大小的正立方體。在搭積木時,小明選取 m 塊積木作為地基,將他們在桌子上一字排開,中間不留空隙,並稱其為第0層。隨後,小明可以在上面擺放第1層,第2層,最多擺放至第n層。擺放積木必須遵循三條規則 其中,小明不喜歡的位置都被...
藍橋杯 2023年第九屆真題 防禦力
還有兩題放在最後寫,不是說它難,而是它有問題。基本可以確定防禦力是錯了,答案沒有按照字典序排序。然後去知乎翻了一波往年的評價,發現那次比賽有三次勘誤,可能包括這個 因為也沒有人提到 採油這題無意中發現有人說了做法,但是其實是有缺陷的,雖然可以過藍橋杯的資料,但是構造了一組樣例把它hack了。所以可能...