标题:全球变暖
你有一张某海域NxN像素的照片,".“表示海洋、”#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
【输出格式】
一个整数表示答案。
【输入样例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【输出样例】
1
题目分析
遍历整个图中的岛屿,对于每一个岛屿进行bfs并标记会被淹没的部分
bfs过程:运用队列依次遍历没有遍历过和没有越界的点。并对于相邻地方有海的点则标记将会被淹没。如果被标记的将会被淹没的点等于岛上的点则它会被淹没。
参考代码
#include <iostream>
#include <queue>
using namespace std;
typedef pair<int,int> PII;
const int N=1003;
char pic[N][N];
PII q[N*N]; //记录坐标
bool state[N][N]; //记录是否被bfs过
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
queue <PII> h;
int ans;
int n;
void bfs(int i1,int j1)
{
int will_flooded=0,flooded=0,all=0;
h.push({i1,j1});
state[i1][j1]=true;
while(h.size())
{
all++;
PII t=h.front();
h.pop();
for(int i=0;i<4;i++)
{
int x=dx[i]+t.first,y=dy[i]+t.second;
if(state[x][y]||x<0||x>=n||y<0||y>=n) continue; //遍历过/越界判断
if(pic[x][y]=='.') flooded++; //目前的点会被淹没
else
{
h.push({x,y});
state[x][y]=true; //标记已被遍历
}
}
if(flooded>0)
{
will_flooded++;
flooded=0;
}
}
if(will_flooded==all) ans++; //这个岛屿的所有地方都会被淹
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>pic[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(pic[i][j]=='#'&&!state[i][j]) bfs(i,j);
cout<<ans;
return 0;
}