全球變暖 第九屆藍橋杯省賽題目九

2021-09-13 12:35:55 字數 3375 閱讀 6482

你有一張某海域nxn畫素的**,"."表示海洋、"#"表示陸地,如下所示:

. . .  . . .  .

.## .  . . .

.## .  . . .

. . .  . ##.

. .# ###.

. ..  ###.

. ..   . . . .

其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。  

由於全球變暖導致了海面上公升,科學家**未來幾十年,島嶼邊緣乙個畫素的範圍會

被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰(上下左右四個相鄰畫素中有海洋),

它就會被淹沒。  

例如上圖中的海域未來會變成如下樣子:

.......

.......

.......

.......

....#..

.......

.......

請你計算:依照科學家的**,**中有多少島嶼會被完全淹沒。  

【輸入格式】

第一行包含乙個整數n。  (1 <= n <= 1000)  

以下n行n列代表一張海域**。  

**保證第1行、第1列、第n行、第n列的畫素都是海洋。  

【輸出格式】

乙個整數表示答案。

【輸入樣例】

7.......

.##....

.##....

....##.

..####.

...###.

.......

【輸出樣例】

1  資源約定:

峰值記憶體消耗(含虛擬機器) < 256m

cpu消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。

注意:main函式需要返回0;

只使用ansi c/ansi c++ 標準;

不要呼叫依賴於編譯環境或作業系統的特殊函式。

所有依賴的函式必須明確地在原始檔中 #include

不能通過工程設定而省略常用標頭檔案。

提交程式時,注意選擇所期望的語言型別和編譯器型別。

#include#includeusing namespace std;

char map[3][1005][1005];//map[2]用來給map[1]搭把手。

int num;

void dfs(int d, int x, int y)

if(map[d][x][y] == '#')

dfs(d, x - 1, y);

dfs(d, x + 1, y);

dfs(d, x, y - 1);

dfs(d, x, y + 1);

return;

}int main()

getchar();

} int formerilandnum = 0;

//先計算圖中包含多少個島嶼。formerilandnum記錄島嶼個數。

for(int i = 0; i < num; i++)}}

//侵蝕島嶼。

//此時map[0]中所有元素已經全部被替換成'.'了。所以需要使用map[1]。

for(int i = 0; i < num; i++) else}}

} }

//計算剩餘海島數量。

int lastilandnum = 0;

//先計算圖中包含多少個島嶼。formerilandnum記錄島嶼個數。

for(int i = 0; i < num; i++)

}} cout參考大佬的部落格發現,實際上,上面程式中並沒有考慮到乙個島嶼被侵蝕後轉化為多個島嶼的情況,如下圖所示:

為了解決這個問題,我採用的方法是另開乙個二維陣列專門用來為聯通的島嶼做標記。最後只需要統計不同標記的個數就可以了。

#include#include#includeusing namespace std;

char map[4][1005][1005];//map[2]用來給map[1]搭把手。map[3]用來給地圖做標記。

int num;

setset_flag;

void dfs(int flag, int d, int x, int y)

if(map[d][x][y] == '#') }

dfs(flag, d, x - 1, y);

dfs(flag, d, x + 1, y);

dfs(flag, d, x, y - 1);

dfs(flag, d, x, y + 1);

return;

}int main()

getchar();

} int formerilandnum = 0;

int flag = 0;

//先計算圖中包含多少個島嶼。formerilandnum記錄島嶼個數。

for(int i = 0; i < num; i++)}}

//侵蝕島嶼。

//此時map[0]中所有元素已經全部被替換成'.'了。所以需要使用map[1]。

for(int i = 0; i < num; i++) else}}

} }

//計算剩餘海島數量。

//先計算圖中包含多少個島嶼。set_flag.size()記錄編號不一致的剩餘島嶼的個數。

for(int i = 0; i < num; i++)

}} cout<1.思路整理

在本題中,用到的方法是dfs/bfs。但是題目比較繞,它問的是求未被淹沒的島嶼的個數。所以我們許多同學都是先dfs/bfs計算淹沒前島嶼的個數,再進行島嶼淹沒操作,並計算淹沒後剩餘島嶼的個數;最後用淹沒前的島嶼個數➖淹沒後的島嶼個數,求得未被淹沒的島嶼的個數。

這種思路很好,但是沒有考慮到淹沒後,島嶼可能會比原來多的情況(上文中已經提到了)。

我的解決方法是在用dfs/bfs計算淹沒前島嶼的個數的時候,順便給每個島嶼做乙個標記flag,flag = 1, 2, 3, 。。。。;在計算剩餘海島個數時,把島嶼的標號裝進乙個set集合,利用集合元素的唯一性消除重複的標號,set.size()即為標號不同的剩餘島嶼的數量。最後用淹沒前的島嶼個數➖標號不同的剩餘島嶼的數量,求得未被淹沒的島嶼的個數。

2.經驗總結

(1)scanf("%c", &map[0][i][j])有問題。 

為什麼?是因為回車符被收入了。 需要補充上getchar()吃掉回車符。 

(2)初學打基礎時最好不要看別人的東西。當窮思竭力後可以查閱大佬們的思路。不能養成不勞而獲、不動腦筋的習慣;也不能一昧地閉門造車、閉關鎖國。

第九屆藍橋杯省賽(9) 全球變暖

你有一張某海域nxn畫素的 表示海洋 表示陸地,如下所示 其中 上下左右 四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。由於全球變暖導致了海面上公升,科學家 未來幾十年,島嶼邊緣乙個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰 上下左右四個相鄰畫素中有海洋 它就會被淹...

第九屆藍橋杯之全球變暖

你有一張某海域nxn畫素的 表示海洋,表示陸地,如下所示 其中 上下左右 四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。由於全球變暖導致了海面上公升,科學家 未來幾十年,島嶼邊緣乙個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰 上下左右四個相鄰畫素中有海洋 它就會被淹...

藍橋杯 第九屆c語言省賽A組 全球變暖

你有一張某海域nxn畫素的 表示海洋 表示陸地,如下所示 其中 上下左右 四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。由於全球變暖導致了海面上公升,科學家 未來幾十年,島嶼邊緣乙個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰 上下左右四個相鄰畫素中有海洋 它就會被淹...