[藍橋杯] 全球變暖

全球變暖

題目

你有一張某海域 N×N 像素的照片,”.”表示海洋、”#”表示陸地,如下所示:

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

由於全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個像素的範圍會被海水淹沒。

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

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

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

輸入格式

第一行包含一個整數N。

以下 N 行 N 列,包含一個由字符”#”和”.”構成的 N×N 字符矩陣,代表一張海域照片,”#”表示陸地,”.”表示海洋。

照片保證第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。

輸出格式

一個整數表示答案。

數據範圍

1N10001≤N≤1000

輸入樣例

> 71 6 5 4 3 2 1

輸出樣例

1

題解

思路

  • bfs 查詢連通塊的個數
#include <iostream>
#include <queue>

using namespace std;

const int N = 1010;
int n, cnt, dx[]={0,1,0,-1}, dy[]={1,0,-1,0};
char g[N][N]; 
bool st[N][N];

bool bfs(int sx, int sy) {
    queue<pair<int,int>> q;
    q.push({sx, sy});
    
    int sum = 0, cnt = 0;
    while (q.size()) {
        auto t = q.front();
        q.pop();
        int x = t.first, y = t.second;
        for (int i = 0; i < 4; i ++) {
            int a = x + dx[i], b = y + dy[i];
            if (a >= 0 && b >= 0 && a < n && b < n && !st[a][b] && g[a][b] == '#') {
                st[a][b] = true;
                q.push({a, b});
                sum ++;
                
                for (int j = 0; j < 4; j ++) {
                    int u = a + dx[j], v = b + dy[j];
                    if (g[u][v] == '.') {
                        cnt ++;
                        break;
                    }
                }
            } 
        }
    }
    if (sum > cnt) return false;
    return true;
}

int main () {
    cin >> n;
    for (int i = 0; i < n; i ++)
        for (int j = 0; j < n; j ++) 
            cin >> g[i][j];
        
    int res = 0;
    for (int i = 0; i < n; i ++) 
        for (int j = 0; j < n; j ++) 
            if (!st[i][j] && g[i][j] == '#' && bfs(i, j)) 
                res ++;
            
    cout << res;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章