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;
}