题目描述
你有一张某海域 N×N 像素的照片,.
表示海洋、 #
表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中 "上下左右" 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 22 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入格式
第一行包含一个整数 N。(1≤N≤1000)。
以下 N 行 N 列代表一张海域照片。
照片保证第 11 行、第 11 列、第 N 行、第 N 列的像素都是海洋。
输出格式
一个整数表示答案。
输入输出样例
输入 #1复制
7 ....... .##.... .##.... ....##. ..####. ...###. .......
输出 #1复制
1
说明/提示
时限 1 秒, 256M。蓝桥杯 2018 年第九届省赛
一道深度优先搜索题。
搜索每个岛屿在淹没后的情况,判断连通块,注意一块岛屿淹没后有可能变成两块,不要直接判断连通块。
#include<iostream>
using namespace std;
char a[1005][1005];
int ans,sum,t,n;
int b[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//方向
void dfs(int x,int y)
{
int r=0;
if(t==0)//一块相连的陆地只能不会被完全淹没一次
{
for(int i=0;i<4;i++)
{
if(a[x+b[i][0]][y+b[i][1]]!='.')//可以为#或者本来是陆地的*
r++;
}
if(r==4)//那么不会被淹没
{
ans++;//不会被完全淹没的陆地数加一
t=1;
}
}
a[x][y]='*';//标记
for(int i=0;i<4;i++)//遍历
{
int q=x+b[i][0],p=y+b[i][1];
if(q>=0 && q<n && p>=0 && p<n && a[q][p]=='#')
dfs(q,p);//递归
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int o=0;o<n;o++)
cin>>a[i][o];
}
for(int i=0;i<n;i++)
{
for(int o=0;o<n;o++)
{
if(a[i][o]=='#')
{//要注意这里的大括号
sum++;//本来的陆地数量
t=0;//遇见新的陆地需重置条件了
dfs(i,o);
}
}
}
cout<<sum-ans;
return 0;
}