识别被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?,但我对那里的答案不太满意。
答案 0 :(得分:2)
你的"漏洞"实际上是由网格形成的图形中的零的连接分量。每个元素有四个邻居。使用connected components或BFS查找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查找孔,如下所示: -
- 在未访问的节点上进行DFS,如果它是0
- 如果达到1或边界,则终止DFS。
- 如果遇到边界,设置变量say boundary_hit = true。
- 计算在DFS期间访问的零元素。
- 但是如果boundary_hit = true则它不能是一个洞
- 仅当border_hit = false时才使用新计数更新max_size。
醇>