细胞个数
时间限制: 1 s
空间限制: 16000 KB
题目等级 : 青铜 Bronze
查看运行结果
题目描述 Description
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如阵列:
0234500067
1034560500
2045600671
0000000089
有4个细胞。
输入描述 Input Description
【输入格式】
整数m,n
(m行,n列)矩阵
输出描述 Output Description
【输出格式】
细胞的个数。
样例输入 Sample Input
4 10
0234500067
1034560500
2045600671
0000000089
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
1<=m,n<=1000
分类标签 Tags 点此展开
思路:【算法分析】
⑴从文件中读入m*n矩阵阵列,将其转换为boolean矩阵存入bz数组中;
⑵沿bz数组矩阵从上到下,从左到右,找到遇到的第一个细胞;
⑶将细胞的位置入队h,并沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置bz数组置为flase;
⑷将h队的队头出队,沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置bz数组置为flase;
⑸重复4,直至h队空为止,则此时找出了一个细胞,因为这个时候他的周围都是0
⑹重复2,直至矩阵找不到细胞;
⑺输出找到的细胞数。
变式:处理寻找矩阵上的数字块的方法,找出第一个点,入队,把周围能入队的点都入队,每一次队列为空,就找到一个
代码:
#include
using namespace std;
#include
#include
int xx[]={0,0,1,-1};
int yy[]={1,-1,0,0};
int jz[1001][1001];
int m,n,sum=0;
int head,tail,dl1[1001],dl2[1001];
void input()
{
cin>>m>>n;
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
{
scanf("%d",&jz[i][j]);
if(jz[i][j]>0)
jz[i][j]=1; //1 shi xi bao 0 bu shi
}
}
void BFS()
{
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
{
if(jz[i][j]==1)
{
head=0;
tail=1;
memset(dl1,0,sizeof(dl1));
memset(dl2,0,sizeof(dl2));
dl1[tail]=i;dl2[tail]=j;
while(head
{
++head;
int x1=dl1[head],y1=dl2[head];
for(int i=0;i<4;++i)
{
int x2=x1+xx[i],y2=y1+yy[i];
if(x2>=1&&x2<=m&&y2>=1&&y2<=n&&jz[x2][y2])
{
jz[x2][y2]=0;
++tail;
dl1[tail]=x2;
dl2[tail]=y2;
}
}
}
sum++;
}
}
}
int main()
{
input();
BFS();
printf("%d\n",sum);
return 0;
}
#include
using namespace std;
#include
#include
int xx[]={0,0,1,-1};
int yy[]={1,-1,0,0};
int jz[1001][1001];
int m,n,sum=0;
int head,tail,dl1[1001],dl2[1001];
void input()
{
cin>>m>>n;
char p[1001];
for(int i=1;i<=m;++i)
{
memset(p,0,sizeof(p));
scanf("%s",p+1);
for(int j=1;j<=n;++j)
{
if(p[j]>'0')
jz[i][j]=1; //1 shi xi bao 0 bu shi
}
}
}
void BFS()
{
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
{
if(jz[i][j]==1)
{
head=0;
tail=1;
memset(dl1,0,sizeof(dl1));
memset(dl2,0,sizeof(dl2));
dl1[tail]=i;dl2[tail]=j;
while(head
{
++head;
int x1=dl1[head],y1=dl2[head];
for(int i=0;i<4;++i)
{
int x2=x1+xx[i],y2=y1+yy[i];
if(x2>=1&&x2<=m&&y2>=1&&y2<=n&&jz[x2][y2])
{
jz[x2][y2]=0;
++tail;
dl1[tail]=x2;
dl2[tail]=y2;
}
}
}
sum++;
}
}
}
int main()
{
input();
BFS();
printf("%d\n",sum);
return 0;
}