你有一张某海域 N×N 像素的照片,.
表示海洋、 #
表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中 "上下左右" 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 22 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入格式
第一行包含一个整数 N。(1≤N≤1000)。
以下 N 行 N 列代表一张海域照片。
照片保证第 11 行、第 11 列、第 N 行、第 N 列的像素都是海洋。
输出格式
一个整数表示答案。
输入输出样例
输入
7 ....... .##.... .##.... ....##. ..####. ...###. .......
输出
1
将会被海水淹没的岛屿用“-”进行标记,不影响后续判断,用ddd数组来记录d数组在df函数中判断岛屿个数,用dfs函数判断海平面上升后的岛屿个数
#include<bits/stdc++.h>
using namespace std;
int n,ans,ans1;
int fx[6]={-1,0,1,0};
int fy[6]={0,1,0,-1};
char d[1010][1010],ddd[1010][1010];
void dfs(int x,int y)
{
d[x][y] = '.';
for(int i = 0;i < 4;i++)
if(d[x + fx[i]][y + fy[i]] != '.' && x + fx[i] > 0 && x + fx[i] <= n && y + fy[i] > 0 && y + fy[i] <= n)
dfs(x + fx[i],y + fy[i]);
return;
}
void df(int x,int y){
ddd[x][y] = '.';
for(int i = 0;i < 4;i++)
if(ddd[x + fx[i]][y + fy[i]] == '#' && x + fx[i] > 0 && x + fx[i] <= n && y + fy[i] > 0 && y + fy[i] <= n)
df(x + fx[i],y + fy[i]);
return;
}
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
cin >> d[i][j],ddd[i][j] = d[i][j];
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
if(d[i][j] == '#' && (d[i - 1][j] == '.' || d[i + 1][j] == '.' || d[i][j - 1] == '.' || d[i][j + 1] == '.'))
d[i][j] = '-';
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
if(ddd[i][j] == '#')
{
ans1++;
df(i,j);
}
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
if(d[i][j] == '#')
{
ans++;
dfs(i,j);
}
printf("%d",ans1 - ans);
return 0;
}