bfs 细胞

【例8.2】细胞


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

【题目描述】

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

阵列

4 10

0234500067

1034560500

2045600671

0000000089

有4个细胞。

【输入】

第一行为矩阵的行n和列m;

下面为一个n*m的矩阵。

【输出】

细胞个数。

【输入样例】

4 10
0234500067
1034560500
2045600671
0000000089

【输出样例】

4

【来源】


No

【算法分析】:

1.由于这题输入之间无空格,所以想着将其由字符转换到数组flag中,然后从上至下,从左到右是,找到第一个细胞数字。

2.然后细胞位置入队,并沿着其上下左右的细胞数字也入队,入队后将细胞数字位置flag=0。

3.然后将该队队头(上一个的最后一个细胞数字)出队,并沿着其上下左右的细胞也入队,入队后将细胞数字位置flag=0。

4.重复3,直至该队为空,此时找出了一个细胞。

5.重复1,直到矩阵找不到细胞数字。

【代码实现】

#include<bits/stdc++.h>
using namespace std;
int n,m,num=0;
int flag[105][105];
int dx[4]={1,0,-1,0},
    dy[4]={0,1,0,-1};
int bfs(int i,int j)
{
    num++;        //细胞数量加1

    int x1[1005],y1[1005];
    x1[1]=i;
    y1[1]=j;
    flag[i][j]=0;    //当前点清0
    int x,y;
    int head=0,tail=1;
    do
    {
        head++;
        for(int k=0;k<=3;k++)  //沿着细胞上下左右搜索
        {
            x=x1[head]+dx[k];
            y=y1[head]+dy[k];

            if(x>=1&&x<=n&&y<=m&&y>=1&&flag[x][y])//是否为细胞数字
            {
                tail++;
                x1[tail]=x;
                y1[tail]=y;
                flag[x][y]=0;

            }  //本方向搜索到的细胞就入队
        }


    }while(head<tail);
}
int main()
{
  char a[100];
     cin>>n>>m;
   for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    flag[i][j]=1;    //初始化,为转换做准备
     for(int i=1;i<=n;i++)    //数字之间没有空格
        {
           cin>>a;
        for(int j=0;j<m;j++)
        if(a[j]=='0')
         flag[i][j+1]=0;
        }
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
        if(flag[i][j])  //遇到细胞入队
          bfs(i,j);
          cout<<num<<endl;


    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值