65.广搜练习:细胞数目


细胞个数

 时间限制: 1 s

 空间限制: 16000 KB

 题目等级 : 青铜 Bronze

题解

 查看运行结果

题目描述 Description

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

0234500067
1034560500
2045600671
0000000089
有4个细胞。

 

输入描述 Input Description

【输入格式】

整数m,n

(m行,n列)矩阵

 

输出描述 Output Description

【输出格式】

细胞的个数。

 

样例输入 Sample Input

4  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\n",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\n",sum);
 return 0;
}

转载于:https://www.cnblogs.com/c1299401227/p/5370752.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值