【发布时间】:2017-07-07 21:07:06
【问题描述】:
我有一个“无限的”二维网格,我想检测封闭/完整的“结构” - 任何形状的区域,这些区域被包围在所有侧面。但是,我需要识别每个单独的闭合电路 - 包括较大的形状(如果有)。
在研究这一点时,我发现了循环检测算法,但我没有看到一种干净/有效的方法来将较大的电路与较小的电路分开。
例如给定以下两个“完整”结构:
0 1 1 1 0
0 1 0 1 0
0 1 1 1 0
0 0 0 0 0
0 1 1 1 1 1
0 1 0 1 0 1
0 1 1 1 1 1
第一个是由 8 个“墙”包围的单个单元格。循环检测使得检测这一点变得微不足道。
第二个示例由示例一的两个副本组成,但它们共享一面墙。我关心三个独立的电路——左边的房间、右边的房间和整体结构。
循环算法的多次传递可能有效,但我必须确保我没有回溯已经找到的形状。
我还查看了洪水填充算法,但它似乎假设您已经知道有界区域内的一个点。对于无限的 2D 网格,如果它 不是 在有效结构中,我需要一个大小限制来强制它放弃。
是否有我遗漏的解决方案或我的想法遗漏了什么?
我只会在添加边界值时执行此“检查”。使用上面的示例,如果我更改任何 0 -> 1,则 可能 创建了一个新循环,我将运行逻辑。我不关心识别单独的结构,并且总是有一个原点坐标。
我一直在研究解决方案posted here,但它们都是基于已经知道哪些节点连接到其他节点。我已经玩弄了识别每条“线”的逻辑,我可以从那里继续前进,但感觉是多余的。
【问题讨论】:
-
怎么无限?我的意思是,如果右边有一百万个地方有一个 1 的平方,你怎么知道?您只是存储 1 的位置吗?
-
网格真的是无限的吗?
-
无限,我的意思是这些“结构”可以是任何形状、合理的大小,以及“无限”2D 网格上的任何位置——在本例中是程序生成的 2D 瓦片地图。
-
看看这篇优秀的论文:Fu Chang、Chun-Jen Chen 和 Chi-Jen Lu 的“使用轮廓跟踪技术的线性时间组件标记算法”。我想您可以通过围绕初始扫描的起始像素螺旋来使该方法适应无限网格的情况。
-
这个问题无法回答,因为缺少这么多细节。看我两天前的评论。您甚至没有定义结构、电路等的含义。如果您计算每个独特的电路,数量将会激增。