题目

image-1669363140900
image-1669363161337

题解

记录边界数和总节点数,若两者相等,则说明该岛会被淹没。

#include<iostream>
using namespace std;
const int N=1010;
typedef pair<int,int> PII;
#define x first 
#define y second
PII q[N*N];
char g[N][N];
bool st[N][N];
int n;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
void bfs(int x,int y,int &total,int &bound){
    int hh=0,tt=0;
    q[hh]={x,y};
    st[x][y]=true;
    while(hh<=tt){
        auto t=q[hh++];
        st[t.x][t.y]=true;
        total++;
        bool is_bound=false;
        for(int i=0;i<4;i++){
            int a=t.x+dx[i],b=t.y+dy[i];
            if(a<0||a>=n||b<0||b>=n)continue;
            if(st[a][b])continue;
            if(g[a][b]=='.'){
               is_bound=true;
               continue;
            }
            q[++tt]={a,b};
            st[a][b]=true;
        }
        if(is_bound)bound++;
    }
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>g[i];
    int cnt=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(!st[i][j]&&g[i][j]=='#'){
                int total=0,bound=0;
                bfs(i,j,total,bound);
                if(total==bound)cnt++;
            }
        }
    }
    cout<<cnt<<endl;
    
    return 0;
}