给定2d数组,找到“洞”

时间:2014-07-30 06:22:33

标签: algorithm

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

可能有任何数量的"漏洞"在2D数组中。

[[1,0,1,1],
 [1,1,1,1],
 [1,0,0,1],
 [1,0,1,1],
 [1,1,1,0]]

注意:我在这里看到了问题:Finding holes in 2d point sets?,但我对那里的答案不太满意。

2 个答案:

答案 0 :(得分:2)

你的"漏洞"实际上是由网格形成的图形中的零的连接分量。每个元素有四个邻居。使用connected componentsBFS查找DFS,选择最大的一个,或总结一下。此算法适用于O(N),其中N是矩阵中元素的数量。

您还可以使用更具体的labeling algorithm,它适用于这些类型的图表,通常出现在图片中。标签还将为您列举所有连接的组件。

如果您对连接组件不感兴趣,那么它们并不完全被连接组件包围,如下所示:

[[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]]

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

答案 1 :(得分:0)

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

  
      
  1. 在未访问的节点上进行DFS,如果它是0
  2.   
  3. 如果达到1或边界,则终止DFS。
  4.   
  5. 如果遇到边界,设置变量say boundary_hit = true。
  6.   
  7. 计算在DFS期间访问的零元素。
  8.   
  9. 但是如果boundary_hit = true则它不能是一个洞
  10.   
  11. 仅当border_hit = false时才使用新计数更新max_size。
  12.