刷题日记 4
目录
题目描述
一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
## 输入格式
第一行两个整数代表矩阵大小 n 和 m。
接下来 n行,每行一个长度为 m 的只含字符 `0` 到 `9` 的字符串,代表这个 n x m 的矩阵。
## 输出格式
一行一个整数代表细胞个数。
## 样例 #1
### 样例输入 #1
```
4 10
0234500067
1034560500
2045600671
0000000089
```
### 样例输出 #1
```
4
```
## 提示
#### 数据规模与约定
对于 100% 的数据,保证 1 <= n,m <= 100。
解题思路
可以选择广度优先算法(BFS)解此题:
1.定义一个队列,遍历地图,遇到细胞数字对其进行BFS,对细胞数字进行扩展入队,将周围所有的细胞数字入队,直到周围都是数字0时,一个细胞找完。
2.为了避免重复寻找,找到一个细胞数字我们将它变为非数字细胞0,这样下次就不用再找了。
代码
#include <stdio.h>
int map[110][110], n, m, ans = 0;
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};//上下左右寻找
int que[100][3];
void bfs(int x, int y) {
map[x][y] = 0;
que[1][1] = x;
que[1][2] = y;//第一个细胞数字入队
int t = 0, w = 1;
int nx, ny;
while (t < w) {
t++;
for (int i = 0; i < 4; i++) {
nx = que[t][1] + dx[i];
ny = que[t][2] + dy[i];//扩展结点
if (nx < 1 || ny < 1 || nx > n || ny > m || map[nx][ny] == 0)//限界
continue;
else {
w++;
que[w][1] = nx;
que[w][2] = ny;
map[nx][ny] = 0;
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%1d", &map[i][j]);//1d取第一位数字
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (map[i][j] != 0) {
ans++;
bfs(i, j);
}
}
}
printf("%d", ans);
}
知识点
因为本题的输入是 0234500067 这种一连串的数字,数字之间没有空格,如果直接 scanf(“%d”, &map[i][j])无法正确输入地图,会把 0234500067 当成一整个数字处理,所以采用 %1d 来限制,代表只取 0234500067 的第一个数字,类似的 %2d 表示只取 第一个和第二个数字。
小tip:
细胞是这样子的哦~
总结
每天都在进步一点点!
欢迎各位大佬斧正!