• 65.广搜练习:细胞数目



    细胞个数

     时间限制: 1 s

     空间限制: 16000 KB

     题目等级 : 青铜 Bronze

     查看运行结果

    题目描述 Description

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

    0234500067
    1034560500
    2045600671
    0000000089
    4个细胞。

     

    输入描述 Input Description

    【输入格式】

    整数m,n

    (m行,n)矩阵

     

    输出描述 Output Description

    【输出格式】

    细胞的个数。

     

    样例输入 Sample Input

    10

    0234500067
    1034560500
    2045600671
    0000000089


     

    样例输出 Sample Output

    4

     

    数据范围及提示 Data Size & Hint

    1<=m,n<=1000

    分类标签 Tags 点此展开 

    思路:【算法分析】

       ⑴从文件中读入m*n矩阵阵列,将其转换为boolean矩阵存入bz数组中;
      
    ⑵沿bz数组矩阵从上到下,从左到右,找到遇到的第一个细胞;
      
    ⑶将细胞的位置入队h,并沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置bz数组置为flase

    ⑷将h队的队头出队,沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置bz数组置为flase
     
    ⑸重复4,直至h队空为止,则此时找出了一个细胞,因为这个时候他的周围都是0
     
    ⑹重复2,直至矩阵找不到细胞;
     
    ⑺输出找到的细胞数。

    变式:处理寻找矩阵上的数字块的方法,找出第一个点,入队,把周围能入队的点都入队,每一次队列为空,就找到一个

    代码:

    #include

    using namespace std;

    #include

    #include

    int xx[]={0,0,1,-1};

    int yy[]={1,-1,0,0};

    int jz[1001][1001];

    int m,n,sum=0;

    int head,tail,dl1[1001],dl2[1001];

    void input()

    {

           cin>>m>>n;

           for(int i=1;i<=m;++i)

             for(int j=1;j<=n;++j)

             {

                 scanf("%d",&jz[i][j]);

                 if(jz[i][j]>0)

                  jz[i][j]=1;          //1 shi xi bao 0 bu shi

             }

    }

    void BFS()

    {

           for(int i=1;i<=m;++i)

             for(int j=1;j<=n;++j)

             {

                 if(jz[i][j]==1)

                 {

                        head=0;

                        tail=1;

                        memset(dl1,0,sizeof(dl1));

                        memset(dl2,0,sizeof(dl2));

                        dl1[tail]=i;dl2[tail]=j;

                        while(head

                        {

                               ++head;

                               int x1=dl1[head],y1=dl2[head];

                               for(int i=0;i<4;++i)

                               {

                                      int x2=x1+xx[i],y2=y1+yy[i];

                                      if(x2>=1&&x2<=m&&y2>=1&&y2<=n&&jz[x2][y2])

                                      {

                                             jz[x2][y2]=0;

                                             ++tail;

                                             dl1[tail]=x2;

                                             dl2[tail]=y2;

                                         }

                                  }

                           }

                           sum++;

                    }

             }

    }

    int main()

    {

           input();

           BFS();

           printf("%d ",sum);

           return 0;

    }

    #include
    using namespace std;
    #include
    #include
    int xx[]={0,0,1,-1};
    int yy[]={1,-1,0,0};
    int jz[1001][1001];
    int m,n,sum=0;
    int head,tail,dl1[1001],dl2[1001];
    void input()
    {
     cin>>m>>n;
     char p[1001];
     for(int i=1;i<=m;++i)
        {
         memset(p,0,sizeof(p));
         scanf("%s",p+1);
       for(int j=1;j<=n;++j)
       {
        
        if(p[j]>'0')
         jz[i][j]=1;          //1 shi xi bao 0 bu shi
       }
         }
    }
    void BFS()
    {
     for(int i=1;i<=m;++i)
       for(int j=1;j<=n;++j)
       {
        if(jz[i][j]==1)
        {
         head=0;
         tail=1;
         memset(dl1,0,sizeof(dl1));
         memset(dl2,0,sizeof(dl2));
         dl1[tail]=i;dl2[tail]=j;
         while(head
         {
          ++head;
          int x1=dl1[head],y1=dl2[head];
          for(int i=0;i<4;++i)
          {
           int x2=x1+xx[i],y2=y1+yy[i];
           if(x2>=1&&x2<=m&&y2>=1&&y2<=n&&jz[x2][y2])
           {
            jz[x2][y2]=0;
            ++tail;
            dl1[tail]=x2;
            dl2[tail]=y2;
           }
          }
         }
         sum++;
        }
       }
    }
    int main()
    {
     input();
     BFS();
     printf("%d ",sum);
     return 0;
    }

  • 相关阅读:
    Flask(7)- request 对象
    2021暑假训练赛1 基于Codeforce#479(div3)
    AtCoder ARC 115 E
    C++11 noexcept 关键字用法学习
    AtCoder ABC 049 C
    【算法学习笔记】块状数据结构:分块思想
    「Codeforces 1131D」Gourmet Choice
    AtCoder Beginner Contest 172 (C题前缀和 + 二分,D题筛因子,E题容斥定理)
    第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(沈阳)补题记录
    泛型动态数组
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290328.html
Copyright © 2020-2023  润新知