zoukankan      html  css  js  c++  java
  • 细胞个数题解(广度优先搜索)

    题目描述:

    一矩形阵(n*m)列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(细胞数字指1到9)

    0234500067

    1034560500

    2045600671

    0000000089

    有四个细胞

    输入:

    第一行输入n和m(n,m<20)

    第二行开始为该矩阵

    输出:

    一共有的细胞个数。

    样例输入:

    4 10

    0234500067

    1034560500

    2045600671

    0000000089

    样例输出:

    4

    本题可以利用广度优先搜索来做;

    先用数组来储存输入的数字,双重循环找到第一个细胞数字并以此为起点搜索,

    将搜索到的细胞数字置为0,ans++;

    下面看代码讲解:

    #include<stdio.h>
    int cell[20][20],ans,m,n;
    //二维数组中的方向有点x,y坐标大小确定 
    int x1[5]={0,1,0,-1,0},y1[5]={0,0,1,0,-1};//利用简单数组表示方向,第一个0无意义;
    //两个数组依次结合代表四个方向 
    void bfs(int x,int y){
        int i;
        for(i=1;i<=4;i++)//依次找到四个方向 
    if(x+x1[i]>0&&x+x1[i]<=n&&y+y1[i]>0&&y+y1[i]<=m/*排除越界的可能*/
        &&cell[x+x1[i]][y+y1[i]]!=0/*确认是否是细胞数字*/){
    cell[x+x1[i]][y+y1[i]]=0; //将找到细胞数字置为0防止重复 
    bfs(x+x1[i],y+y1[i]);//搜索下一个点 
    }
    }
    int main(){
        scanf("%d%d",&n,&m);
        int i,j,k;
        for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
          scanf("%1d",&cell[i][j]);//数字之间无空格,“%d”改为“%1d”即可 
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
        if(cell[i][j]!=0){
        cell[i][j]=0;//千万不能漏 
    bfs(i,j);
        ans++;
             }
        }
        printf("%d",ans);
    }
  • 相关阅读:
    海康SDK/大华SDK协议视频智能分析平台EasyCVR播放器界面滚动条属性优化分享
    TSINGSEE青犀视频EasyCVR视频融合共享平台兼容性再扩展,大华SDK轻松接入
    海康SDK/大华SDK安防视频智能分析平台EasyCVR如何将通道视频流推送至CDN分发?
    迭代器和生成器
    内置函数
    递归函数
    函数进阶------闭包函数
    装饰器
    函数
    经典100厘
  • 原文地址:https://www.cnblogs.com/alan-blog-TsingHua/p/9733937.html
Copyright © 2011-2022 走看看