全球變暖
題目
你有一張某海域 N×N 像素的照片,”.”表示海洋、”#”表示陸地,如下所示:
其中”上下左右”四個方向上連在一起的一片陸地組成一座島嶼,例如上圖就有 2 座島嶼。
由於全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個像素的範圍會被海水淹沒。
具體來說如果一塊陸地像素與海洋相鄰(上下左右四個相鄰像素中有海洋),它就會被淹沒。
例如上圖中的海域未來會變成如下樣子:
請你計算:依照科學家的預測,照片中有多少島嶼會被完全淹沒。
輸入格式
第一行包含一個整數N。
以下 N 行 N 列,包含一個由字符”#”和”.”構成的 N×N 字符矩陣,代表一張海域照片,”#”表示陸地,”.”表示海洋。
照片保證第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。
輸出格式
一個整數表示答案。
數據範圍
輸入樣例
輸出樣例
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;
}