现在的位置: 首页 > 综合 > 正文

细胞个数

2018年01月17日 ⁄ 综合 ⁄ 共 1269字 ⁄ 字号 评论关闭

【问题描述】
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
【输入格式】
第一行为两整数m,n(m行,n列)
从第行开始是一个m*n的矩阵
【输出格式】
只有一行为矩阵中的细胞个数。
【输入样例】

4 10
0234500067
1034560500
2045600671
0000000089

【输出样例】

4

算法步骤:
1、从文件中读入m*n矩阵,将其转换为0、1矩阵存入a数组中;
2、沿a数组矩阵从上到下,从左到右,找到遇到的第一个细胞;将细胞的位置入队q,并沿其上、下、左、右四个方向上搜索,如果遇到细胞(a[i,j]=1)则将其位置入队,入队后的位置a[i,j]数组置为0;
3、将h队的队头出队,沿其上、下、左、右四个方向上搜索,如果遇到细胞则将其位置入队,入队后的位置a数组置为0;
4、重复3,直至h队空为止,则此时找出了一个细胞;
5、重复2,直至矩阵找不到细胞;
6、输出找到的细胞数。

c++代码
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
const int gx[4]={0,0,-1,1};
const int gy[4]={1,-1,0,0};
int m,n,tot=0;
bool a[110][110];
void init();
void work(int,int);
int main()
{
	init();
	for(int i=1;i<=m;i++)//枚举整个m*n矩阵 
	  for(int j=1;j<=n;j++)
	    if(a[i][j])work(i,j);//找到一个细胞,并对该细胞进行处理 
	cout<<tot<<endl;
	return 0;
}
void work(int x,int y)
{
	queue<int> qx,qy;//两队列分别存储当前点的行和列 
	int x1,y1;
	tot++;//细胞数加一 
	qx.push(x);//把当前细胞的行和列入队 
	qy.push(y);
	a[x][y]=0;//当前细胞因为已计算,赋为false 
	while(!qx.empty())//当队列非空 
	{
		for(int i=0;i<4;i++)//对当前细胞的上下左右进行搜索 
		{
			x1=qx.front()+gx[i];
			y1=qy.front()+gy[i];
			if(x1>0&&x1<=m&&y1>0&&y1<=n&&a[x1][y1])
			{
				qx.push(x1);//如果没有越界且(x1,y1)为细胞 ,入队 
				qy.push(y1);
				a[x1][y1]=false; 
			}
		}
		qx.pop();//for循环结束,a[x][y]相邻细胞处理完成,则 将其出队 
		qy.pop();
	}
}
void init()
{
	string s;
	cin>>m>>n;
	for(int i=1;i<=m;++i)
	{
		cin>>s; 
		for(int j=0;j<n;++j)
		  if(s[j]=='0')a[i][j+1]=0;
		  else a[i][j+1]=1;
	}
}

【上篇】
【下篇】

抱歉!评论已关闭.