1.题目描述
菌落的数量对医生来说一直是一个很重要的数据,但是细菌数量太多人工又无法计数,因此你能写人程序都助医生完成这人任冬么?有一张n和的菌落的显微镜照片,每个格子是0(表示当前位置无细菌)或者1(表示当前位置是细菌),请你输出这张照片中菌落的数量如果一个细菌,其上下左右四个方向有细菌的话,则这些相邻的细菌属于一个菌落。例如给定如下照片:
0010
0101
1100
则给出的照片一共有A,B,C三个菌落,如下:
00A
OBOC
B B O0
2.输入和输出
输入数据第一行两个整数n,m (1<=n,m<=100),表示照片的长和宽接下来n行,每行都有m个用空格隔开的整数(0或者1),表示这一照片行的状态(有无细菌)
输出一个整数,表示该张照片中菌落数量
3.样例输入
35 00101 01011 11001 |
4.样例输出
3 |
5.解题思路
将录入数据的数组中的1都变为-1.防止后续使用count计数时造成干扰;
构建一个递归函数f(行,列),通过对行列加1和减1,对相邻元素进行排查,若为-1,则变为count,并对该元素的相邻元素进行排查,以此将同属一个菌落的细菌都变成count;
void f(int x,int y){
int k,b,c;
int h[4]={0,1,-1,0};
int l[4]={-1,0,0,1};
for(k=0;k<=3;k++){
b=x+h[k];
c=y+l[k];
if(a[b][c]==-1){
a[b][c]=a[x][y];
f(b,c);
}
6.代码
#include<stdio.h>
int a[105][105]={0};
void f(int x,int y){
int k,b,c;
int h[4]={0,1,-1,0};
int l[4]={-1,0,0,1};
for(k=0;k<=3;k++){
b=x+h[k];
c=y+l[k];
if(a[b][c]==-1){
a[b][c]=a[x][y];
f(b,c);
}
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
if(a[i][j]==1)a[i][j]=-1;
}
}
int count=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==-1){
count++;
a[i][j]=count;
f(i,j);
}
}
}
printf("%d",count);
return 0;
}