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);
    }
  • 相关阅读:
    CF1202F You Are Given Some Letters...
    CF1178E Archaeology
    PTA (Advanced Level) 1005 Spell It Right
    PTA (Advanced Level) 1004 Counting Leaves
    Qt5——从零开始的Hello World教程(Qt Creator)
    PTA (Advanced Level) 1003 Emergency
    PTA (Advanced Level) 1002 A+B for Polynomials
    HDU 1272 小希的迷宫
    FZU 2150 Fire Game
    HihoCoder
  • 原文地址:https://www.cnblogs.com/alan-blog-TsingHua/p/9733937.html
Copyright © 2011-2022 走看看