#4923. Cells / 细胞

Cells / 细胞

Problem: Cells / 细胞

版权信息: 博主原创文章,遵循 CC 4.0 BY-SA 版权协议


任务总览

任务名称 时间限制 内存限制 分数
细胞计数 1000 ms 65536 KB 5 points

题目描述

给定一个由数字 0 到 9 组成的矩形阵列,其中数字 1 到 9 代表细胞。细胞的定义是:如果沿着细胞的数字上下左右相邻的数字也是细胞数字,则这些数字属于同一个细胞。你需要计算给定矩形阵列中细胞的个数。

例如:

输入:

4 10
0234500067
1034560500
2045600671
0000000089

输出:

4

解释:

  • 有 4 个细胞,细胞数字为 1 到 9,0 代表空地。

输入格式

  • 第一行包含两个整数 nm1 ≤ n, m ≤ 1000),表示矩阵的行数和列数。
  • 接下来的 n 行,每行包含 m 个数字,代表矩阵。

输出格式

  • 输出一个整数,表示细胞的个数。

输入输出示例

输入示例

4 10
0234500067
1034560500
2045600671
0000000089

输出示例

4

题目分析与解法

  1. 问题类型​:这是一个连通区域计数问题。我们需要通过深度优先搜索(DFS)或广度优先搜索(BFS)来遍历矩阵中的每个细胞并计数。
  2. 思路​:
    • 遍历矩阵的每个格子。
    • 对于每一个未访问过的细胞数字(1 到 9),我们可以使用 DFS 或 BFS 从该格子开始,标记所有与其相连的细胞为已访问。
    • 这样每次启动一次 DFS 或 BFS 都会发现一个新的细胞,并且把与其连通的所有细胞都标记为已访问,直到所有细胞都被处理。
    • 计数每次启动 DFS 或 BFS 的次数,这就是细胞的个数。
  3. DFS 实现​:
    • 使用递归或者栈来实现深度优先搜索。
    • 对于每个细胞(1-9),如果该细胞尚未被访问,则启动 DFS,遍历其所有相邻的细胞。
  4. BFS 实现​:
    • 使用队列来实现广度优先搜索。

时间复杂度分析

步骤 复杂度
读取输入 O(n * m)
DFS 或 BFS 遍历矩阵
总复杂度 O(n * m)

由于 n, m ≤ 1000,最坏情况下矩阵的大小为 1000 * 1000,因此时间复杂度 O(n * m) 是可以接受的。


结论

  1. 使用 DFS 或 BFS 来遍历矩阵,查找连通的细胞。
  2. 统计细胞的个数,每次从一个新细胞开始 DFS 或 BFS 都会发现一个新的细胞。
  3. 输出细胞的总数。