zoukankan      html  css  js  c++  java
  • ybt 1329 细胞 广度优先搜索 (二维,寻找符合条件节点)

    1329:【例8.2】细胞


    时间限制: 1000 ms         内存限制: 65536 KB
    提交数: 8535     通过数: 4744

    【题目描述】

    一矩形阵列由数字00到99组成,数字11到99代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:

    阵列

    4 10
    0234500067
    1034560500
    2045600671
    0000000089

    44个细胞。

    【输入】

    第一行为矩阵的行nn和列mm;

    下面为一个n×mn×m的矩阵。

    【输出】

    细胞个数。

    【输入样例】

    4 10
    0234500067
    1034560500
    2045600671
    0000000089

    【输出样例】

    4

    源代码
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<math.h>
    #include<queue>
    using namespace std;
    
    struct STU
    {
        int xx;
        int yy;
    };//定义结构体,为点的横坐标和纵坐标
    
    queue<STU> q;
    char a[1000][1000];
    int mapp[1000][1000];
    int n,m,qx,qy,tx,ty,ans=0;
    int go[5][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}};
    
    void bfs(int x,int y)
    {
        q.push((STU){x,y});
        
        mapp[x][y]=0;
        
        while(q.size()!=0)//不需要设置返回值
        {
            qx=q.front().xx;
            qy=q.front().yy;
            q.pop();
            
            for(int i=1;i<=4;i++)
            {
                tx=qx+go[i][0];
                ty=qy+go[i][1];
                
                if(tx<1||tx>n||ty<1||ty>m||mapp[tx][ty]==0)
                {
                    continue;
                }
                
                mapp[tx][ty]=0;
                q.push((STU){tx,ty});
            }
        }
    }
    
    int main(void)
    {
        cin>>n>>m;
        
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
                if(a[i][j]!='0')
                {
                    mapp[i][j]=1;//是细胞的节点标记为1
                }
            }
        }
        
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(mapp[i][j]==1)
                {
                    ans++;//记录细胞块数量
                    bfs(i,j);//将细胞块遍历,将该细胞块标记为0
                }
            }
        }
        
        cout<<ans;
        return 0;
    }
    
    
    
    这道题的也是广度优先搜索,这里的搜索不用设置返回值,只需要一直遍历,当四周没有细胞时,便会自动退出搜索,这样,可以有效地将成块的细胞块标记掉,避免
    重复计算。
  • 相关阅读:
    CF 441E Valera and Number
    CodeForces 1111E. Tree
    CodeForces 1098F. Ж-function
    CodeForces 1098E. Fedya the Potter
    CodeForces 1098D. Eels
    CodeForces 1103E. Radix sum
    CodeForces 1103D. Professional layer
    CodeForces 1103C. Johnny Solving
    CodeForces 1107F. Vasya and Endless Credits
    Hackerrank: Week of Code 36
  • 原文地址:https://www.cnblogs.com/jd1412/p/12569294.html
Copyright © 2011-2022 走看看