洛谷 P1451 求细胞数量

题目描述

一矩形阵列由数字 00 到 99 组成,数字 11 到 99 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

输入格式

第一行两个整数代表矩阵大小 nn 和 mm。

接下来 nn 行,每行一个长度为 mm 的只含字符 0 到 9 的字符串,代表这个 n \times mn×m 的矩阵。

输出格式

一行一个整数代表细胞个数。

输入输出样例

4 10
0234500067
1034560500
2045600671
0000000089

  

4

分析

基础bfs染色题目,将字符串转化为整型01图来标记,遍历每一个点,如果这个点没有被标记,则代表整个区块没有被标记,从当前点染色整个区块。

代码

#include<bits/stdc++.h>
using namespace std;

int n,m;

char mp[105][105];
int mark[105][105];
int ans;
int move_x[4]={0,-1,0,1};
int move_y[4]={1,0,-1,0}; 

struct Point
{
    int xx;
    int yy;
    Point(int _xx,int _yy):
        xx(_xx),yy(_yy){}
};

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>mp[i][j];
            if(mp[i][j]=='0') mark[i][j]=1;//打好标记不能走 
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(mark[i][j]==1) continue;//走不了 
            queue <Point> node;
            node.push(Point(i,j));
            mark[i][j]=1;//染色
            ans++;//区块之前没有被染色,答案+1 
            while(!node.empty())//染色当前点所在区块 
            {
                Point now_node=node.front();
                node.pop();
                for(int k=0;k<4;k++)
                {
                    Point new_node=Point(now_node.xx+move_x[k],now_node.yy+move_y[k]);
                    if(mark[new_node.xx][new_node.yy]!=1&&new_node.xx<=n&&new_node.xx>=1&&new_node.yy>=1&&new_node.yy<=m)
                    {
                        mark[new_node.xx][new_node.yy]=1;
                        node.push(new_node);
                    }
                }
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/KyleDeng/p/15560172.html