1329:【例8.2】细胞
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 8535 通过数: 4744
【题目描述】
一矩形阵列由数字00到99组成,数字11到99代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:
阵列
4 10 0234500067 1034560500 2045600671 0000000089
有44个细胞。
【输入】
第一行为矩阵的行nn和列mm;
下面为一个n×mn×m的矩阵。
【输出】
细胞个数。
【输入样例】
4 10 0234500067 1034560500 2045600671 0000000089
【输出样例】
4
源代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<queue>
using namespace std;
struct STU
{
int xx;
int yy;
};//定义结构体,为点的横坐标和纵坐标
queue<STU> q;
char a[1000][1000];
int mapp[1000][1000];
int n,m,qx,qy,tx,ty,ans=0;
int go[5][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}};
void bfs(int x,int y)
{
q.push((STU){x,y});
mapp[x][y]=0;
while(q.size()!=0)//不需要设置返回值
{
qx=q.front().xx;
qy=q.front().yy;
q.pop();
for(int i=1;i<=4;i++)
{
tx=qx+go[i][0];
ty=qy+go[i][1];
if(tx<1||tx>n||ty<1||ty>m||mapp[tx][ty]==0)
{
continue;
}
mapp[tx][ty]=0;
q.push((STU){tx,ty});
}
}
}
int main(void)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]!='0')
{
mapp[i][j]=1;//是细胞的节点标记为1
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(mapp[i][j]==1)
{
ans++;//记录细胞块数量
bfs(i,j);//将细胞块遍历,将该细胞块标记为0
}
}
}
cout<<ans;
return 0;
}
这道题的也是广度优先搜索,这里的搜索不用设置返回值,只需要一直遍历,当四周没有细胞时,便会自动退出搜索,这样,可以有效地将成块的细胞块标记掉,避免
重复计算。