4959. 岛屿个数

4959. 岛屿个数 - AcWing题库

题解:

先在矩阵外面加一层海水(‘0’),之后bfs2(0,0)搜连通的海水,如果遇到岛屿(‘1’)就岛屿数ans++,bfs1()把岛屿标记,这样在环岛屿里的子岛屿海水进不去(也就是搜不到),就不用ans++,海水能到达的都是能搜的到的,最后ans就是答案

#include
using namespace std;
typedef pairPII;
const int N=110;
//海水偏移量
int dxx[]={-1,-1,0,1,1,1,0,-1},dyy[]={0,1,1,1,0,-1,-1,-1};
//岛屿偏移量
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int t,m,n;
int st[N][N];
int ans=0;
char g[N][N];
//搜岛屿bfs板子
void bfs1(int x,int y)
{
    ans++;
    queueq;
    st[x][y]=1;
    q.push({x,y});
    while(q.size())
    {
        PII t=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int sx=t.first+dx[i],sy=t.second+dy[i];
            if(st[sx][sy])continue;
            if(sx<0||sx>m+1||sy<0||sy>n+1)continue;
            if(g[sx][sy]=='0')continue;
            st[sx][sy]=1;
            q.push({sx,sy});
        }
    }

}
//正常搜海水bfs板子
void bfs2(int x,int y)
{
    queueq;
    st[x][y]=1;
    q.push({x,y});
    while(q.size())
    {
        PII t=q.front();
        q.pop();
        for(int i=0;i<8;i++)
        {
            int sx=t.first+dxx[i],sy=t.second+dyy[i];
            if(st[sx][sy])continue;
            if(sx<0||sx>m+1||sy<0||sy>n+1)continue;
            if(g[sx][sy]=='1')bfs1(sx,sy);//遇到岛屿就把岛屿都搜一遍 把搜到的标记一下
            else
            {
                st[sx][sy]=1;
                q.push({sx,sy});
            }
        }
    }
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        ans=0;
        memset(st,0,sizeof st);
        memset(g,'0',sizeof g);
        scanf("%d %d",&m,&n);
        for(int i=1;i<=m;i++)
        {
            getchar();
            for(int j=1;j<=n;j++)
            {
                scanf("%c",&g[i][j]);
            }
        }
        printf("\n");
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                printf("%c",g[i][j]);
            }
            printf("\n");
        }
//        bfs2(0,0);
//        printf("%d\n",ans);
    }
}

你可能感兴趣的:(算法)