细胞个数题解(广度优先搜索)

题目描述:

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

0234500067

1034560500

2045600671

0000000089

有四个细胞

输入:

第一行输入n和m(n,m<20)

第二行开始为该矩阵

输出:

一共有的细胞个数。

样例输入:

4 10

0234500067

1034560500

2045600671

0000000089

样例输出:

4

本题可以利用广度优先搜索来做;

先用数组来储存输入的数字,双重循环找到第一个细胞数字并以此为起点搜索,

将搜索到的细胞数字置为0,ans++;

下面看代码讲解:

#include<stdio.h>
int cell[20][20],ans,m,n;
//二维数组中的方向有点x,y坐标大小确定 
int x1[5]={0,1,0,-1,0},y1[5]={0,0,1,0,-1};//利用简单数组表示方向,第一个0无意义;
//两个数组依次结合代表四个方向 
void bfs(int x,int y){
    int i;
    for(i=1;i<=4;i++)//依次找到四个方向 
if(x+x1[i]>0&&x+x1[i]<=n&&y+y1[i]>0&&y+y1[i]<=m/*排除越界的可能*/
    &&cell[x+x1[i]][y+y1[i]]!=0/*确认是否是细胞数字*/){
cell[x+x1[i]][y+y1[i]]=0; //将找到细胞数字置为0防止重复 
bfs(x+x1[i],y+y1[i]);//搜索下一个点 
}
}
int main(){
    scanf("%d%d",&n,&m);
    int i,j,k;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
      scanf("%1d",&cell[i][j]);//数字之间无空格,“%d”改为“%1d”即可 
for(i=1;i<=n;i++)
    for(j=1;j<=m;j++){
    if(cell[i][j]!=0){
    cell[i][j]=0;//千万不能漏 
bfs(i,j);
    ans++;
         }
    }
    printf("%d",ans);
}
原文地址:https://www.cnblogs.com/alan-blog-TsingHua/p/9733937.html