C++ 中查找矩阵所有连通非空单元格的大小

2025 年 5 月 12 日 | 阅读 4 分钟

问题陈述

我们得到一个二进制矩阵,这意味着矩阵中将只有两个元素:零 (0) 或一 (1),其中非空单元格由一 (1) 表示,空单元格由零 (0) 表示。我们的任务是找到所有可能的连接的非空单元格组件。两个单元格必须在水平或垂直方向上相邻才能被称为连接。

例如

输入

  • mat[][] = {[3,1],[4,1]}

输出

  • 2

输入

  • mat[][] = {[1,2],[2,1]}

输出

  • 1

算法

  • 创建一个队列数据结构,然后添加一个值为 cell(mat[i][j] = 1) 的单元格。
  • 遍历插入单元格的相邻单元格,并对其执行 BFS 或 DFS。
  • 验证是否存在任何边界条件,如果元素现在是 1,则将其翻转为 0。
  • 更新连接的非空单元格的大小,并标记已访问的单元格。
  • 最后打印获得的每个连接的每一侧。

程序 1

让我们来看一个 C++ 程序,使用 DFS 遍历来查找矩阵所有连接的非空单元格的大小。

输出

Find the size of all Connected Non-Empty Cells of a Matrix in C++

时间复杂度

使用 DFS 遍历查找矩阵所有连接的非空单元格大小的时间复杂度为 O(rs * cs)。

空间复杂度

使用 DFS 遍历查找矩阵所有连接的非空单元格大小的空间复杂度为 O(rs * cs)。

程序 2

让我们来看另一个 C++ 程序,使用 BFS 遍历来查找矩阵所有连接的非空单元格的大小。

输出

Find the size of all Connected Non-Empty Cells of a Matrix in C++

时间复杂度

使用 BFS 遍历查找矩阵所有连接的非空单元格大小的时间复杂度为 O(rs * cs)。

空间复杂度

使用 BFS 遍历查找矩阵所有连接的非空单元格大小的空间复杂度为 O(rs * cs)。

结论

总而言之,我们可以得出结论,广度优先搜索 (BFS) 和深度优先搜索 (DFS) 都提供了有效且高效的解决方案,其时间复杂度为 O(rs*cs),空间复杂度也为 O(rs*cs)。这里,rs 代表矩阵的行数,cs 代表矩阵的列数,用于确定矩阵中所有连接的非空单元格的大小。DFS 和 BFS 之间的选择取决于各种因素,例如内存限制、遍历顺序和问题规范。综合考虑所有因素后,这两种方法都高效地解决了给定问题。