【一本通1329:【例8.2】细胞&&洛谷P1451 求细胞数量】

1329:【例8.2】细胞

【题目描述】

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

阵列

4 10
0234500067
1034560500
2045600671
0000000089

有4个细胞。

【输入】

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

下面为一个n*m的矩阵

【输出】

细胞个数。

【输入样例】

4 10
0234500067
1034560500
2045600671
0000000089

【输出样例】

4
#include<bits/stdc++.h>//万能头还挺好用(考试千万别用啊)
using namespace std;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//各种路径的情况
int bz[100][100],num=0,n,m;
void doit(int p,int q)
{
    int x,y,t,w,i;
    int h[1000][2];
    num++;//计次专用
    bz[p][q]=0;
    t=0;w=1;h[1][1]=p;h[1][2]=q;//一波特判
    do
    {
        t++;
        for(int i=0;i<=3;i++)//大力模拟各种情况,广搜
        {
            x=h[t][1]+dx[i];
            y=h[t][2]+dy[i];
            if((x>=0)&&(x<m)&&(y>=0)&&(y<n)&&(bz[x][y]))//if判断十分重要
            {
                w++;
                h[w][1]=x;
                h[w][2]=y;
                bz[x][y]=0;
            }
        }
    }
    while(t<w);
}
int main()
{
    int i,j;
    char s[100],ch;
    scanf("%d%d
",&m,&n);
    for(int i=0;i<=m-1;i++)
    {
        for(int j=0;j<=n-1;j++)
        {
            bz[i][j]=1;
        }
    }
    for(int i=0;i<=m-1;i++)
    {
        scanf("%s",s);
        for(int j=0;j<=n-1;j++)
        {
            if(s[j]=='0')
            {
                bz[i][j]=0;
            }
        }
    }
    for(int i=0;i<=m-1;i++)
    {
        for(int j=0;j<=n-1;j++)
        {
            if(bz[i][j])
            {
                doit(i,j);
            }
        }
    }
    printf("%d",num);
}

这个题相对来说还挺好理解的

主要的还是广搜的思想

学会的可以拿下面的题目来试试(PS:下面这个题与细胞极为相似,但需要用字符串哦qwq)

一本通1249:Lake Counting

原文地址:https://www.cnblogs.com/gongcheng456/p/10741158.html