自用。
题目传送门:求细胞数量 - 洛谷
题解:Inori_333
题目描述
一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入格式
第一行两个整数代表矩阵大小 n 和 m。
接下来 n 行,每行一个长度为 m 的只含字符 0
到 9
的字符串,代表这个 n×m 的矩阵。
输出格式
一行一个整数代表细胞个数。
输入输出样例
输入 #1
4 10
0234500067
1034560500
2045600671
0000000089
输出 #1
4
说明/提示
数据规模与约定
对于 100% 的数据,保证 1≤n,m≤100。
/*
P1451 求细胞数量
https://www.luogu.com.cn/problem/P1451
2024/10/04 submit:inori333
*/
#include<bits/stdc++.h>
using namespace std;
int n, m; // 矩阵为n行m列
int cellsAmount = 0; // 细胞数量
int dx[4] = {1, -1, 0, 0}; // x方向单位向量
int dy[4] = {0, 0, 1, -1}; // y方向单位向量
int mtx[105][105];//矩阵
bool vis[105][105]; // 每个单元是否被访问过
/*
Sample:
4 10
0234500067
1034560500
2045600671
0000000089
*/
void DFS(int x,int y){
vis[x][y] = 1; // 当前点标记为已经访问
int curx, cury;
//向上下左右四个方向移动
for (int i = 0; i < 4;i++){
curx = x + dx[i];
cury = y + dy[i];
if (vis[curx][cury] || mtx[curx][cury] == 0) // 如果移动后的点不是细胞或者已经被访问
continue; // 进入下一次循环
DFS(curx, cury); // 搜索下一个位置
}
}
int main(){
cin >> n >> m;//输入矩阵行列数
memset(mtx, 0, sizeof(mtx));//将存储矩阵的二维数组初始化为0
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m;j++){
char ch;
cin >> ch;
mtx[i][j] = ch - '0';
}
}
for (int i = 1; i <= n;i++){
for (int j = 1; j <= m;j++){
if(vis[i][j]==0&&mtx[i][j]!=0){ // 如果当前位置未被访问且是细胞
DFS(i, j); // 对当前位置的联通块进行染色
cellsAmount++; // 细胞数量+1
}
}
}
cout << cellsAmount << endl;
return 0;
}