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;
}
···完结撒花···
本文来自博客园,作者:XDFZ武斌,转载请注明原文链接:https://www.cnblogs.com/XDFZwb1523/p/16061364.html

浙公网安备 33010602011771号