题目大意:
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
比如:
一共有4个细胞。
思路:
这是一道BFS的题目,从a[1][1]搜到a[n][m],找到一个细胞就把这个细胞和紧挨着的细胞清零,并计数。
也就是说,每找到一个细胞就进行一次BFS,将相邻的细胞清零后继续寻找下一个细胞。
(温馨提示:数字1,2,3,4,5,6,7,8,9其实没有区别,都是细胞,不需要分开处理)
代码:
#include <iostream>
#include <cstdio>
using namespace std;
bool a[101][101];
int n,m,father[10001],state[3][10001],sum;
int dx[5]={0,0,0,1,-1};
int dy[5]={0,-1,1,0,0};
void bfs(int x,int y)
{
int head,tail,i,j,qx,qy;
head=0;
tail=1;
father[1]=0;
a[x][y]=0;
state[1][1]=x;
state[2][1]=y; //初始化
do
{
head++;
for (i=1;i<=4;i++)
{
qx=state[1][head]+dx[i]; //qx表示行
qy=state[2][head]+dy[i]; //qy表示列
if (qx>0&&qx<=n&&qy>0&&qy<=m&&a[qx][qy]) //如果没出界并且是细胞
{
tail++;
father[tail]=head; //入队
state[1][tail]=qx;
state[2][tail]=qy;
a[qx][qy]=0;
}
}
}
while(head<tail);
}
int main()
{
int i,j;
char read;
scanf("%d%d\n",&n,&m);
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
read=getchar();
if (read>='1'&&read<='9') a[i][j]=1;
}
read=getchar();
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++) //一个一个找细胞
{
if (a[i][j]==1) //如果这是细胞
{
bfs(i,j); //寻找与它相邻的细胞
sum++; //计数
}
}
printf("%d",sum);
return 0;
}
(这道题和找石油很像,方法基本一样)