P8662 [蓝桥杯 2018 省 AB] 全球变暖
思路:用bfs依次读取每座岛屿,当岛屿里出现一块四周都是陆地的陆地时,岛屿就不算被淹没,bfs里面就是常规的st状态数组,g图数组,还有用数组模拟队列
#include <iostream>
#include <cstring>
using namespace std;
typedef pair<int,int> PII;
int n;
char g[1010][1010];
int st[1010][1010];
PII q[1000010];
int res,flag;
int bfs(int x,int y)
{
memset(q,0,sizeof q);
flag=0;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
q[0]={x,y};
int tt=0,ll=0;
while(ll<=tt)
{
PII t=q[ll++];
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) continue;
if(g[a][b]!='#') continue;
if(st[a][b]) continue;
st[a][b]=1;
q[++tt]={a,b};
}
if(g[t.first+1][t.second]=='#'&&g[t.first][t.second+1]=='#'&&g[t.first][t.second-1]=='#'&&g[t.first-1][t.second]=='#'&&g[t.first][t.second]=='#') flag++;
}
if(flag>=1) return -1;这里不能提前结束,要跑完整个岛屿
return 0;
}
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(!st[i][j]&&g[i][j]=='#')
{
int xy=bfs(i,j);
if(xy==0) res++;
}
}
}
cout<<res;
return 0;
}