【问题标题】:How to detect connected components in a 2D array?如何检测二维数组中的连通分量?
【发布时间】:2017-03-10 04:15:43
【问题描述】:

正如上面的标题所述。我想知道二维数组中是否有多少组件。而组件由 1 个数字组成,数组中只有 0 和 1 个数字。 我通过使用带有递归调用的 DFS(深度优先搜索)算法和一个数组来标记已访问的单元格来实现这个问题。 但是,我想用另一种方式来实现这个问题,而不使用递归、堆栈、队列、结构......只允许使用 for/while 函数。

示例: 数组数据:

0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 1
0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1
0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1
0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1
0 0 1 1 1 0 0 0 0 1 0 1 0 1 0 1
0 0 0 0 0 1 1 1 0 1 0 1 1 1 0 1
0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1
0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0
0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0
0 1 0 1 1 1 1 1 0 0 1 1 1 1 0 0
0 1 0 1 0 1 0 1 0 0 1 1 1 1 0 0
0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0

确定具有特定标签的组件后的数组。

0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
0 0 2 2 2 0 3 3 0 1 0 0 0 0 0 1
0 0 2 0 2 0 3 3 0 1 0 4 4 4 0 1
0 0 2 0 2 0 0 0 0 1 0 4 0 4 0 1
0 0 2 0 2 0 0 0 0 1 0 4 0 4 0 1
0 0 2 2 2 0 0 0 0 1 0 4 0 4 0 1
0 0 0 0 0 5 5 5 0 1 0 4 4 4 0 1
0 0 0 0 0 5 0 5 0 1 0 0 0 0 0 1
0 0 0 0 0 5 5 5 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 6 6 6 6 6 0 0 0 0 7 7 7 7 0 0
0 6 0 0 0 6 0 0 0 0 7 0 0 7 0 0
0 6 0 6 6 6 6 6 0 0 7 7 7 7 0 0
0 6 0 6 0 6 0 6 0 0 7 7 7 7 0 0
0 6 6 6 6 6 6 6 0 0 0 0 0 0 0 0
0 6 6 6 6 6 6 6 0 0 0 0 0 0 0 0

提前谢谢你。

【问题讨论】:

  • 如果你能分享一下你为什么要这样做,以及你到目前为止所做的尝试会更好。
  • 其实这是我的功课,我最近才说编程。我的老师不允许我在课堂上使用课外的东西。这就是为什么我在 DFS 算法中使用递归函数来解决这个问题,但它不被接受。也不允许使用堆栈、队列、结构。我只能使用 for/while 循环,这个问题的正常功能。希望大家能体谅!

标签: arrays recursion multidimensional-array depth-first-search


【解决方案1】:

我猜你可以遍历矩阵,检查每个单元格的邻居,如果邻居的值 > 0 则复制邻居的值,如果所有邻居都为 0,则设置一个新值。在伪代码中:

comp = 1
for i = 0 to n:
  for j = 0 to n:
    for nei : neighbours(i, j):
      if nei > 0:
        m[i,j] = nei
        break
      m[i,j] = comp
      comp++

而邻居是与 (i, j) 相邻的 4 个(或 2 个)相邻单元格

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多