sdf1552


问题 B: 细胞问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 739  解决: 402
[提交][状态][讨论版]

题目描述

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

输入

第一行 :两个数字M N (1<=M<=50 1<=N<80)表示该阵列有M行N列,从第2行到第M+1行 每行有连续的N个字符。

输出

一行: 细胞个数。

样例输入

4 10
0234500067
1034560500
2045600671
0000000089

样例输出

4

提示


#include<cstdio>

#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;

/*
4 10
0234500067
1034560500
2045600671
0000000089
思路,
*/

int m,n;
const int MAXM=50;
const int MAXN=80;
int a[MAXM][MAXN];//存地图
int vis[MAXM][MAXN];//存标记
int dir[4][2] = {
    { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 }
};

void bfs(int i, int j)
{
    queue<pair<int,int>> q;
    //找到一个队列头
    vis[i][j]=1;
    q.push({i, j});

    //所有相关的全部入队搜索
    while(!q.empty())
    {
        auto f=q.front();
        q.pop();
        int nx,ny;
        for(int k=0;k<4;k++)
        {
            nx=f.first+dir[k][0];
            ny=f.second+dir[k][1];
            if(nx<0 || nx>=m || ny<0 || ny>=n)
                continue;
            if(a[nx][ny]!=0 && !vis[nx][ny])
            {
                vis[nx][ny]=1;
                q.push({nx, ny});
            }
        }
    }
}

int main()
{  
    cin>>m>>n;
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        {
            char c;
            cin>>c;
            a[i][j]=c-'0';
        }

    int cnt=0;//总共几个细胞

    // 遍历所有非0点,用队列宽搜,搜索时做标记
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        {
            //找到一个队列头
            if(a[i][j]!=0 && !vis[i][j])
            {
                cnt++;
                bfs(i,j);
            }

        }
    cout<<cnt<<endl;
    return 0;
}



posted on 2021-10-19 14:44  katago  阅读(33)  评论(0编辑  收藏  举报