全球變暖|2018年藍橋杯B組題解析第九題-fishers
標題:全球變暖
你有一張某海域NxN畫素的照片,"."表示海洋、"#"表示陸地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。
由於全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰(上下左右四個相鄰畫素中有海洋),它就會被淹沒。
例如上圖中的海域未來會變成如下樣子:
.......
.......
.......
.......
....#..
.......
.......
請你計算:依照科學家的預測,照片中有多少島嶼會被完全淹沒。
7
.###...
.####..
.##....
...###.
..####.
...###.
.......
【輸入格式】
第一行包含一個整數N。 (1 <= N <= 1000)
以下N行N列代表一張海域照片。
照片保證第1行、第1列、第N行、第N列的畫素都是海洋。
【輸出格式】
一個整數表示答案。
【輸入樣例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【輸出樣例】
1
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
注意:
main函式需要返回0;
只使用ANSI C/ANSI C++ 標準;
不要呼叫依賴於編譯環境或作業系統的特殊函式。
所有依賴的函式必須明確地在原始檔中 #include
不能通過工程設定而省略常用標頭檔案。
提交程式時,注意選擇所期望的語言型別和編譯器型別。
思路:dfs統計連通分量,這裡稍微有點變化:先change一遍改變原地形(天氣變暖,陸地變成海洋),再對新地形進行dfs統計連通分量(島嶼數量)。
程式碼:
#include<iostream> using namespace std; int n; int ans = 0; char a[1010][1010]; char b[1010][1010]; void dfs(int x,int y){ a[x][y] = '.'; for(int dx = -1;dx<=1;dx++){ for(int dy = -1;dy<=1;dy++){ if(dx==dy) continue; if(a[x+dx][y+dy] == '#'){ dfs(x+dx,y+dy); } } } } void change(int x,int y){ //上下左右四個方向 如果有陸地 就將他變成海洋 for(int dx = -1;dx<=1;dx++){ for(int dy = -1;dy<=1;dy++){ if(dx==dy) continue; if(a[x+dx][y+dy] == '#'){ a[x+dx][y+dy] = '.'; } } } } int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; b[i][j] = a[i][j]; } } //天氣變暖後 陸地淹沒 for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][j] == '.' && b[i][j] == '.'){ change(i,j); } } } //剩下陸地 組成島嶼 開始dfs統計島嶼數目(連通分量) for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][j] == '#'){ ans++; dfs(i,j); } } } cout<<ans<<endl; return 0; }