题目链接:http://codevs.cn/problem/3492/

https://www.luogu.com.cn/problem/P1451

题目描述 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

题目分析:

首先,题目描述的数据格式跟后台检测的数据格式不一致。后台检测的数据格式类似于下面:

4 10
0 2 3 4 5 0 0 0 6 7
1 0 3 4 5 6 0 5 0 0
2 0 4 5 6 0 0 6 7 1
0 0 0 0 0 0 0 0 8 9

所以,输入数据时应该要用int数组直接保存即可,不是用char数组保存。

【算法思路】
⑴从文件中读入m*n矩阵阵列,将其转换为bool矩阵存入b数组中;
⑵沿b数组矩阵从上到下,从左到右,找到遇到的第一个细胞;
⑶将细胞的位置入队h,入队后的位置b数组置为flase;
⑷将h队的队头出队,沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置b数组置为flase;
⑸重复4,直至h队空为止,则此时找出了一个细胞;
⑹重复2,直至矩阵找不到细胞;
⑺输出找到的细胞数。

AC代码:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
bool b[][];
int n,m,a[][],ans=;
int dx[] = {-,,,},
dy[] = {,,,-};
void bfs(int x, int y)
{
int hx[],hy[],head=,tail=,tx,ty;
ans++;
hx[]=x,hy[]=y;
b[x][y]=false;
for(;head<=tail;++head)
{
for (int i=;i<=;++i)
{
tx=hx[head]+dx[i],
ty=hy[head]+dy[i];
if(tx> && tx<=m && ty> && ty<=n && b[tx][ty])
{
tail++;
hx[tail]=tx,
hy[tail]=ty;
b[tx][ty]=false;
}
}
}
}
int main()
{
scanf("%d%d",&m,&n);
for (int i=;i<=m;++i)
for (int j=;j<=n;++j)
b[i][j]=true;
for (int i=;i<=m;++i)
for (int j=;j<=n;++j)
{
scanf("%1d",&a[i][j]);
if (!a[i][j]) b[i][j]=false;
}
for (int i=;i<=m;++i)
for (int j=;j<=n;++j)
if(b[i][j]) bfs(i,j);
printf("%d",ans);
return ;
}

另一种写法:

 #include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
int main(int argc, char *argv[])
{
queue<int> qx,qy;
int n,m,i,j,x,y;
int a[][];
int count=;//细胞个数 scanf("%d%d",&n,&m);
for(i=;i<n;i++)
{
for(j=;j<m;j++)
{
scanf("%d",&a[i][j]);
//printf("%d ",a[i][j]);
}
//printf("\n");
} for(i=;i<n;i++)
{
for(j=;j<m;j++)
{
if(a[i][j]!=)
{
qx.push(i); qy.push(j);
a[i][j]=;
while(!qx.empty())
{
x=qx.front(); qx.pop();
y=qy.front(); qy.pop(); if(y+<m&&a[x][y+]!=)//当前坐标x,y的右边
{
qx.push(x); qy.push(y+);
a[x][y+]=;
}
if(x+<n&&a[x+][y]!=)//当前坐标x,y的下边
{
qx.push(x+); qy.push(y);
a[x+][y]=;
}
if(y->=&&a[x][y-]!=)//当前坐标x,y的左边
{
qx.push(x); qy.push(y-);
a[x][y-]=;
}
if(x->=&&a[x-][y]!=)//当前坐标x,y的上边
{
qx.push(x-); qy.push(y);
a[x-][y]=;
}
}
count++;
}
}
}
printf("%d\n",count);/**/
return ;
}

code vs 3492 细胞个数的更多相关文章

  1. 【OpenCV】基于kmeans的细胞检测方法

    问题是这样的,有一幅经过二值化处理之后的图像,我们希望统计其中细胞的个数,和不同粘连情况的细胞个数,比如,下图中有1个细胞组成连通区域的,也有2个细胞组成连通区域的,也有更多个细胞组成连通区域的,我们 ...

  2. Luogu T7152 细胞(递推,矩阵乘法,快速幂)

    Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...

  3. Luogu P1451 求细胞数量

    题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.(1<=m,n<=100)? 输入输出格式 输 ...

  4. 数细胞-swust oj

    数细胞(0964) 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.编程需要用到的队列及其相关函数已经实现,你只需要完 ...

  5. P1451 求细胞数量

    题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.(1<=m,n<=100)? 输入输出格式 输 ...

  6. 【一本通1329:【例8.2】细胞&&洛谷P1451 求细胞数量】

    1329:[例8.2]细胞 [题目描述] 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.如: 阵列 4 10 023 ...

  7. 洛谷 P1451 求细胞数量

    题目链接 https://www.luogu.org/problemnew/show/P1451 题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字 ...

  8. 【dfs】p1451 求细胞数量

    题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.(1<=m,n<=100)? 输入输出格式## ...

  9. 计算细胞数【BFS】

    问题描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数. 输入格式 2行:第1行为两个整数 mm, nn, 代表矩阵 ...

随机推荐

  1. Windows Server 2012上安装.NET Framework 3.5(不需要安装光盘)

    因为在windows2012里,安装数据库,IIS部分组件都需要.NET3.5,而默认windows2012安装时,并不会把此组件复制到电脑里 导致,后期要安装.NET3.5还需要安装盘.但是,很多人 ...

  2. Sutherland-Hodgeman多边形裁剪

    原文地址:http://course.cug.edu.cn/cugFirst/computer_graphics/class/course/3-3-1-a.htm

  3. Java学习笔记——IO操作之以图片地址下载图片

    以图片地址下载图片 读取给定图片文件的内容,用FileInputStream public static byte[] mReaderPicture(String filePath) { byte[] ...

  4. pthread_once重塑singleton模式

    单件模式是非线程安全的: // Single threaded version class Foo { private Helper helper = null; public Helper getH ...

  5. Asp.net WebAPi gzip压缩和json格式化

    现在webapi越来越流行了,很多时候它都用来做接口返回json格式的数据,webapi原本是根据客户端的类型动态序列化为json和xml的,但实际很多时候我们都是序列化为json的,所以webapi ...

  6. 自定义View 水印布局 WaterMark 前景色 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. Druid连接池简介和配置

    Druid是什么?有什么作用?  Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. Druid ...

  8. jQuery源码分析-构造函数详解

    在jQuery.js的构造函数中,充分利用了JavsScript语言的动态性——对行参的类型和个数没有的严格要求,以至于一个函数可以实现多种功能需求,也为JavaScript语言的多态性提供了基础,在 ...

  9. ubuntu完全卸载apache2

    最近刚接触ubuntu和apache,第一次配置就被apahce搞到完全崩溃,跟着网上的配置修改apache的charset和apache2.conf以后,开始出现访问http://localhost ...

  10. (转)Unity3D 游戏贴图(法线贴图,漫反射贴图,高光贴图)

    原帖网址http://www.u3dpro.com/read.php?tid=207  感谢jdk900网友的辛苦编写 我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图 ...