ACM-数细胞

题目描述:数细胞

一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。编程需要用到的队列及其相关函数已经实现,你只需要完成count函数以及主函数即可。 #include #include using namespace std; const int maxsize =50000; struct pos { int x; int y; }; typedef struct se { pos data[maxsize]; int front,rear; }Sequeue; void init(Sequeue *&Q) { Q=(Sequeue *)malloc(sizeof(Sequeue)); Q->front=-1; Q->rear=-1; } void change(int a[50][50],int m,int n) { int i,j; for(i=0;i<m;i++) for(j="0;j<n;j++)" if(a[i][j]!="0)" a[i][j]="1;" }="" int="" empty(sequeue="" *q)="" {="" if(q-="">rear==Q->front) return 1; else return 0; } void insertsequeue(Sequeue *&Q,int i,int j) { if((Q->rear+1)%maxsize==Q->front) { cout<<"队列已满!"<<endl; exit(0);="" }="" q-="">rear=(Q->rear+1)%maxsize; Q->data[Q->rear].x=i; Q->data[Q->rear].y=j; } void delsequeue(Sequeue *&Q,int &i,int &j) { if(Q->rear==Q->front) { cout<<"队列已空!"<<endl; exit(0);="" }="" q-="">front=(Q->front+1)%maxsize; i=Q->data[Q->front].x; j=Q->data[Q->front].y; } int count(int a[50][50],int m,int n) { } int main() { return 1; }

输入

第一行输入两个整数,分别代表矩阵的行和列 输入m*n的矩阵,由数字0到9组成。

输出

细胞个数。

样例输入

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

样例输出

1

思路:题目要使用BFS,我直接用DFS也可以A,数细胞就是数矩阵相连个数,直接每次DFS后计数即可。

// 数细胞.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

/*由1连接成多少个整块*/
#include <iostream>
#include <cstring>
const int MAX = 1005;
using namespace std;
int n, m, ans, map[MAX][MAX], vis[MAX][MAX];//地图
int dis[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1};//标记数组,方向数组
void DFS(int x, int y)//横纵坐标,在递归中将走过的点标记为1
{
    for (int i = 0; i < 4; i++)
    {
        int tx = x + dis[i][0];//根据方向数组改变方向
        int ty = y + dis[i][1];
        if (tx >= 0 && tx<n && ty >= 0 && ty<m && map[tx][ty] && !vis[tx][ty])//在地图中且是1,并且没走过,走过的地方不能回头
        {
            vis[tx][ty] = 1;//标记为走过
            DFS(tx, ty);
        }
    }
}
int main()
{
    while (cin >> n >> m)//行列
    {
        //init
        memset(map, 0, sizeof(map));
        memset(vis, 0, sizeof(vis));
        ans = 0;

        //read
        for (int i = 0; i<n; i++)
        for (int j = 0; j < m; j++)
        {
            int t;
            cin >> t;
            if (t >= 1 && t <= 9) map[i][j] = 1;
            else map[i][j] = 0;
        }

        //找起点,即找到开始递归的坐标
        for (int i = 0; i<n; i++)
        {
            for (int j = 0; j<m; j++)
            {
                if (map[i][j] && !vis[i][j])
                {
                    vis[i][j] = 1;
                    DFS(i, j);//当递归全部结束后,说明已经不能再找到W与这部分相连
                    ans ++;
                }
            }
        }

        cout << ans;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/x739400043/p/8538620.html

时间: 2024-08-30 16:50:14

ACM-数细胞的相关文章

数细胞-swust oj

数细胞(0964) 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.编程需要用到的队列及其相关函数已经实现,你只需要完成count函数以及主函数即可. 第一行输入两个整数,分别代表矩阵的行和列 输入m*n的矩阵,由数字0到9组成. 4 10 1 2 3 4 5 1 1 1 6 7 1 0 3 4 5 6 1 5 1 0 2 0 4 5 6 6 1 6 7 1 0 0 6 0 6 6 1 0 8 9 细胞个数. 1

ACM——数的计算

数的计算——(递归(超时)和非递归) 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:1050            测试通过:312 描述 要求找出具有下列性质数的个数(包含输入的自然数n):先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:1. 不作任何处理;2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止. 输入 一个自然数n

数细胞

一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数. 第一行输入两个整数,分别代表矩阵的行和列 输入m*n的矩阵,由数字0到9组成. 输入: 4 10 1 2 3 4 5 1 1 1 6 7 1 0 3 4 5 6 1 5 1 0 2 0 4 5 6 6 1 6 7 1 0 0 6 0 6 6 1 0 8 9 输出: 1 代码: #include<iostream>#include<queue>using

自己来实现一个简易的OCR

来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人来说是一座高山 对于大多数程序员都应该算难度不小吧. 但是我们这里 这么简陋的功能 还用那些玩意 作为一个程序员的自我修养 你还玩个球.管他代码写得咋个low 效率咋个低 被高手嗤之以鼻也好 其实那些高手也就那样 把你的代码走起来  ,这是一件很好玩的事情. 以前一直觉着这玩意挺神奇 什么OCR o

[ACM] SDUT 2883 Hearthstone II (第二类Stiring数)

Hearthstone II Time Limit: 2000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 The new season has begun, you have n competitions and m well prepared decks during the new season. Each competition you could use any deck you want, but each of the decks must

TYVJ 1127 计算细胞数(DFS)

计算细胞数 From 陈超锐 描述 Description 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数. 如:阵列 0234500067 1034560500 2045600671 0000000089  有4个细胞 输入格式 InputFormat 第一行 :两个数字M N (1<=M<=50 1<=N<80)表示该阵列有M行N列  从第2行到第M+1行 每行有连续的N个字符 输出格式 Outp

ACM之数论数字根

先来看一道杭电的数字根问题 此题的大大意是输入一个数,如果它不是一位的数字的话,那么我们就将它的每一位都相加,相加后如果还是两位或者更多的话那么我们继续取出它的每一位数字进行相加,知道等到单个数字为止. 初次看到这道题,并没有看n的取值范围,便直接写了个int类型的,不一会就写出来了,测试,通过.然而呢,当我提交的时候才知道,正因为没有给出n的取值范围,所以你需要考虑大数的问题! 当然数论的题,常常包含着我们或许不知道的定理啊,什么的,毕竟像ACM之类的题,我们通常不能直接按照题目的叙述直接做,

ACM 杭电HDU 2084 数塔 [解题报告]

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 36261    Accepted Submission(s): 21659 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

[ACM] FZU 1570 集合划分问题( 不同小球放入相同盒子,第二类Stirling数)

Problem Description n个元素的集合{1,2,...,n}可以划分若干个非空子集.例如,当n=4时,集合{1,2,3,4}可以划分为15个不同的非空子集如下: {{1},{2},{3},{4}}, {{1,2},{3},{4}}, {{1,3},{2},{4}}, {{1,4},{2},{3}}, {{2,3},{1},{4}}, {{2,4},{1},{3}}, {{3,4},{1},{2}}, {{1,2},{3,4}}, {{1,3},{2,4}}, {{1,4},{2,