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

1329:【例8.2】细胞

【题目描述】

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

阵列

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[]={-,,,},dy[]={,,,-};//各种路径的情况
int bz[][],num=,n,m;
void doit(int p,int q)
{
int x,y,t,w,i;
int h[][];
num++;//计次专用
bz[p][q]=;
t=;w=;h[][]=p;h[][]=q;//一波特判
do
{
t++;
for(int i=;i<=;i++)//大力模拟各种情况,广搜
{
x=h[t][]+dx[i];
y=h[t][]+dy[i];
if((x>=)&&(x<m)&&(y>=)&&(y<n)&&(bz[x][y]))//if判断十分重要
{
w++;
h[w][]=x;
h[w][]=y;
bz[x][y]=;
}
}
}
while(t<w);
}
int main()
{
int i,j;
char s[],ch;
scanf("%d%d\n",&m,&n);
for(int i=;i<=m-;i++)
{
for(int j=;j<=n-;j++)
{
bz[i][j]=;
}
}
for(int i=;i<=m-;i++)
{
scanf("%s",s);
for(int j=;j<=n-;j++)
{
if(s[j]=='')
{
bz[i][j]=;
}
}
}
for(int i=;i<=m-;i++)
{
for(int j=;j<=n-;j++)
{
if(bz[i][j])
{
doit(i,j);
}
}
}
printf("%d",num);
}

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

主要的还是广搜的思想

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

一本通1249:Lake Counting

上一篇:函数的不同调用方式决定了this的指向不同


下一篇:洛谷 P1451 求细胞数量