Algorithm 给定一个2d数组,找到;“洞”;

Algorithm 给定一个2d数组,找到;“洞”;,algorithm,Algorithm,标识完全由1包围的0(不需要对角覆盖)。在下面的示例中,大小应为3 二维阵列中可能有任意数量的“孔” [[1,0,1,1], [1,1,1,1], [1,0,0,1], [1,0,1,1], [1,1,1,0]] 注意:我在这里看到了一个问题:,但我对这里的答案不是很满意。你的“洞”实际上是由网格形成的图形中零的连接组件。每个元素有四个邻居。用或查找,选择最大的一个,或将其汇总。该算法适用于O(N),其中N是矩阵中的元素数 您还可以使用更具体的,适用于这些类型的图形,通常从图像中显示。

标识完全由1包围的0(不需要对角覆盖)。在下面的示例中,大小应为3

二维阵列中可能有任意数量的“孔”

[[1,0,1,1],
 [1,1,1,1],
 [1,0,0,1],
 [1,0,1,1],
 [1,1,1,0]]
注意:我在这里看到了一个问题:,但我对这里的答案不是很满意。

你的“洞”实际上是由网格形成的图形中零的连接组件。每个元素有四个邻居。用或查找,选择最大的一个,或将其汇总。该算法适用于
O(N)
,其中
N
是矩阵中的元素数

您还可以使用更具体的,适用于这些类型的图形,通常从图像中显示。标签还将为您枚举所有连接的组件

如果您对连接的组件不感兴趣,这些组件并没有完全被连接的组件包围,例如:

[[1,0,1,1],
 [1,1,1,1],
 [1,0,0,1],
 [0,0,1,1],  // <-- Note zero in the beginning
 [1,1,1,0]]
[[0,0,0,0,0,0]
 [0,1,0,1,1,0],
 [0,1,1,1,1,0],
 [0,1,0,0,1,0],
 [0,0,0,1,1,0],
 [0,1,1,1,0,0],
 [0,0,0,0,0,0]]

然后忽略外部连接的组件。在本例中,没有更多组件,因此答案为零。

您可以使用简单DFS查找孔,如下所示:-

  • 如果是0,则在未访问的节点上执行DFS
  • 如果达到1或边界,则终止DFS
  • 如果命中边界,则设置一个变量say boundary_hit=true
  • 计算DFS期间访问的零元素
  • 但如果boundary_hit=true,那么它就不可能是一个洞
  • 仅当边界命中=false时,才使用新计数更新最大大小

  • 在这个例子中它是怎样的3?你所说的“不需要对角线覆盖”是什么意思?这些孔的形状可能不规则。你如何决定哪一个是对角单元格?@yifanwu什么是大小?零孔计数?或者周长大小或者边界框最大的大小或者是什么?顺便说一句,链接的问题和你的问题不一样,它适用于大型数据集,这些数据集的点与矩阵中的点不完全相同,而是具有有限的精度,作为实际测量的浮点坐标!只需在图像中添加标签,即所谓的分割(在本例中为二值图像)