问题描述
你有一张某海域 N x N 像素的照片,.
表示海洋、#
表示陆地,如下所示:
. . . . . . .
. # # . . . .
. # # . . . .
. . . . # # .
. . # # # # .
. . . # # # .
. . . . . . .
其中 “上下左右” 四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。
具体来说如果一块陆地像素与海洋相邻 (上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . # . .
. . . . . . .
. . . . . . .
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入格式
第一行包含一个整数 N。
以下 N 行 N 列代表一张海域照片。
照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。
输出格式
一个整数表示答案。
输入样例
7
.......
.##....
.##....
....##.
..####.
...###.
.......
输出样例
1
数据范围
1
≤
N
≤
1000
1 ≤ N ≤ 1000
1≤N≤1000
题解
BFS:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
const int N = 1010;
int n;
int ans;
char g[N][N];
bool used[N][N];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
bool bfs(int x, int y)
{
queue<PII> q;
q.push({x, y});
used[x][y] = true;
bool flood = true; // 判断该岛屿是否会被完全淹没
while(q.size())
{
PII t = q.front();
q.pop();
bool flag = false; // 判断该陆地是否靠海
for (int i = 0; i < 4; i ++)
{
int a = t.first + dx[i], b = t.second + dy[i];
if(a < 1 || a > n || b < 1 || b > n || used[a][b]) continue;
if(g[a][b] == '.')
{
flag = true; // 该陆地靠海
continue;
}
q.push({a, b});
used[a][b] = true;
}
if(!flag) flood = false; // 该陆地不靠海,则岛屿无法完全淹没
}
return flood;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++) cin >> g[i] + 1;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
if(g[i][j] == '#' && !used[i][j])
ans += bfs(i, j);
cout << ans << endl;
return 0;
}