全球变暖https://www.acwing.com/problem/content/description/1235/https://www.acwing.com/problem/content/description/1235/
题目思路 ? ? 一个可行的办法是载入原始地图后直接寻找有多少岛屿被直接淹没,如果是统计淹没后还剩多少岛屿,再用原岛屿数减去,会发现淹没后原本为一个的岛屿变成了两个甚至更多,这样就没办法算出正确答案了。
? ? 被直接淹没的岛屿性质:边界数等于岛屿格子总数,利用这个性质寻找共多少完全淹没岛屿 寻找岛屿利用bfs即可,找到所有连通块。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int,int> pii;
int n,m;
int d[1005][1005],dx[4]={1,0,0,-1},dy[4]={0,1,-1,0},cnt;//d是判重数组,dxdy偏移量数组,cnt某岛屿格子总数
char g[1005][1005];//原始地图
int bfs(int x,int y)
{
int bound=0;//边界数初始化,放主函数里也一样
queue<pii> q;
q.push(make_pair(x,y));
while(q.size())//bfs
{
pii t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=t.first+dx[i];
int y=t.second+dy[i];
if(x>n||y>n||y<1||x<1||d[x][y]!=-1||g[x][y]!='#')continue;//当新坐标超界,已被搜过或不是岛屿,跳过
d[x][y]=1;//条件满足,更新判重值
cnt++;//岛屿总数加一
q.push(make_pair(x,y));
for(int k=0;k<4;k++)//判断该格子是否为边界,如果是,边界数加一
{
if(g[x+dx[k]][y+dy[k]]=='.')
{
bound++;break;//break以防重复增加边界格子数
}
}
}
}
return bound;
}
int main()
{
int i ,j ,k ,cnt1=0,ans=0;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>g[i];
}//读入原始地图
memset(d,-1,sizeof d);//把判重数组初始化
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(g[i][j]=='#'&&d[i][j]==-1)//当遇到新大陆
{
cnt=0;//cnt代表某个岛屿的格子数
int bound=bfs(i,j);//bound代表这个岛屿的边界数
if(cnt==bound)ans++;//当边界数等岛屿全部格子数时,岛屿全部淹没,答案加一
}
}
}
cout<<ans;//大功告成,输出答案
}
|