题目描述:
一矩形阵(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); }