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;
}


这道题的也是广度优先搜索,这里的搜索不用设置返回值,只需要一直遍历,当四周没有细胞时,便会自动退出搜索,这样,可以有效地将成块的细胞块标记掉,避免
重复计算。
原文地址:https://www.cnblogs.com/jd1412/p/12569294.html