1341: 求细胞数量

题目描述:

一矩形阵列由数字0到9组成。我们把数字1到9称为细胞数字,数字0称为非细胞数字。
若一个细胞数字上、下、左、右仍是细胞数字,我们则把这些细胞数字称为同一细胞。 求给定矩形阵列中细胞的个数。

输入:

第1行,整数m、n(m表示行,n表示列、1<=m,n<=100)
接下来的m行表示输入的矩形阵列

输出:

细胞的个数

样例输入:

4  10
0234500067
1034560500
2045600671
0000000089

样例输出:

4


解题思路:

此题就是一道简单的BFS的求连通块。

遍历每一个点,将每个点都BFS一遍,前提是这个点不等于0(即是数字细胞) 和 这个点没有被访问过。只要能进入BFS,说明肯定有一个细胞,ans++;

进入BFS的时候,先判断当前递归到的这个点是不是0 和 这个点有没有被访问过,如果是就直接return 掉。否则就开始遍历周围的点,且将当前这个点标记为访问过。

BFS结束后,直接输出ans即可。

代码:

#include <bits/stdc++.h>
using namespace std;
 
int mp[105][105];//记录矩阵 
bool vis[105][105];//标记数组,是否被访问 
int fx[5] = {0,-1,0,0,1};//x坐标的变化 
int fy[5] = {0,0,1,-1,0};//y坐标的变化 
 
void bfs(int x,int y){//BFS开始遍历周围的点 
    if(mp[x][y] == 0 || vis[x][y] ) return ;
    //如果其为0(不是数字细胞)或 被访问过 就直接return 
    else{
        vis[x][y] = true;//将当前点标记为访问过 
        for (int i = 1;i <= 4;i++){//遍历上下左右的点 
            bfs(x+fx[i],y+fy[i]);
        }
    }
}
 
int main(){
    int m,n;
    scanf("%d%d",&m,&n);
    for (int i = 1;i <= m;i++){
        for (int j = 1;j <= n;j++){
            scanf("%1d",&mp[i][j]);
            //!注意题目!输入之间没有空格,要改变输入方式,不然会直接把一整行读入进去 
        }
    }
    //输入
    
    for (int i = 1;i <= m;i++){
        for (int j = 1;j <= n;j++){
            vis[i][j] = false;
        }//将所有点都标记为未访问 
    }
     
    int ans = 0;//答案便量 
     
    for (int i = 1;i <= m;i++){
        for (int j = 1;j <= n;j++){//循环遍历每一个点 
            if(mp[i][j] != 0 && vis[i][j] == false){
            //如果这个点不是0,并且没被访问过,就说明这是一个细胞(单个也是一个细胞) 
                ans++;//有一个细胞 
                bfs(i,j);//从这个点开始,遍历周围的点 
            }
        }
    }
     
    cout<<ans;
    return 0;
} 

···完结撒花···

posted @ 2022-03-26 23:02  XDFZ武斌  阅读(117)  评论(0)    收藏  举报