zoukankan      html  css  js  c++  java
  • 【例8.2】细胞

    1329:【例8.2】细胞


    时间限制: 1000 ms         内存限制: 65536 KB
    提交数: 3463     通过数: 1929 

    【题目描述】

    一矩形阵列由数字09组成,数字19代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:

    阵列

    4 10
    0234500067
    1034560500
    2045600671
    0000000089

    4个细胞。

    【输入】

    第一行为矩阵的行n和列m;

    下面为一个n×m的矩阵。

    【输出】

    细胞个数。

    【输入样例】

    4 10
    0234500067
    1034560500
    2045600671
    0000000089

    【输出样例】

    4
    例题不怎么详的解:
    这题没什么拐弯抹角的事情,就是相当于一个基本的BFS模型,只要能写出BFS的基本结构,这道题就十分简单。

    除了BFS框架,唯一要注意的就是数据表格直接没有空格,要通过字符串的形式输入,并转换成数组储存,数组可以由1代表细胞,0代表不是细胞。
    得到这个数组后,我们只需遍历一遍这个二维数组,寻找1的位置,再将与这个1的位置和与这个1的位置相连同属一个细胞的位置全部改成0,后面就不会重复了。
    BFS的过程也很简单,就是先将第一个找到的1入队,再向这个1的上下左右四个方向继续寻找是否有1,如果有,入队,上一个找到的1出队,如此往复直到队空。
    如果队列已空,说明四周都没有细胞组成部分了,这样一个细胞就找到了。

    这里需要提前了解队列的知识,BFS的实现原理就是队列判空,这里使用数组模拟队列更为方便。

    算法分析:
    在简单理清思路后,我们根据程序框架,很容易根据框架写出核心的BFS代码。
    void bfs(int x0,int y0)
    {
        int head=1,tail=1;
     
        q[tail].x=x0;
        q[tail].y=y0;
        tail++;
     
        while(head<tail)
        {
            int x=q[head].x;
            int y=q[head].y;
            g[x][y]='0';
            for(int i=0;i<4;i++)
            {
                int nx=x+dir[i][0];
                int ny=y+dir[i][1];
                if(0<=nx&&nx<n&&0<=ny&&ny<m&&g[nx][ny]!='0')
                {
                    q[tail].x=nx;
                    q[tail].y=ny;
                    tail++;
                }
            }
            head++;
        }
    }
    

    样例代码:
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<cstdlib>
    #include<queue>
    #include<vector>
    #define INF 0x3f3f3f3f
    #define PI acos(-1.0)
    #define N 1001
    #define MOD 2520
    #define E 1e-12
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//增量数组
    using namespace std;
    int n,m;
    char g[N][N];
    struct node{
        int x;
        int y;
    }q[N*1000];
    void bfs(int x0,int y0)
    {
        int head=1,tail=1;
     
        q[tail].x=x0;
        q[tail].y=y0;
        tail++;
     
        while(head<tail)
        {
            int x=q[head].x;
            int y=q[head].y;
            g[x][y]='0';
            for(int i=0;i<4;i++)
            {
                int nx=x+dir[i][0];
                int ny=y+dir[i][1];
                if(0<=nx&&nx<n&&0<=ny&&ny<m&&g[nx][ny]!='0')
                {
                    q[tail].x=nx;
                    q[tail].y=ny;
                    tail++;
                }
            }
            head++;
        }
    }
    int main()
    {
        int cnt=0;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            scanf("%s",g[i]);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(g[i][j]!='0')
                {
                    cnt++;
                    bfs(i,j);
                }
        printf("%d
    ",cnt);
        return 0;
    }
    

      

     
     
  • 相关阅读:
    正则匹配任意字(包括换行符)
    linux终端光标的快捷键操作
    正则向前查找和向后查找
    正则表达式软件Expresso
    JsonP 跨域完全解析
    PHP代码阅读Phpxref
    ubuntu 操作用户名和密码
    curl多线程解释[转]
    php递归创建多级目录
    离散数学 第一章 命题逻辑 11 命题及其表示法
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/10390825.html
Copyright © 2011-2022 走看看