1. 程式人生 > >全球變暖|2018年藍橋杯B組題解析第九題-fishers

全球變暖|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;
}