【发布时间】:2014-06-23 04:50:09
【问题描述】:
我有一个 3D“立方”矩阵,其中一些单元格已填充,而其他单元格为空。由填充单元包围的封闭区域表示中空形状。例如,基质中的细胞可以以这样的方式填充,它们一起形成空心球体的表面。现在,我想要一个有效的方法来填充这个球体的内部:如果一个单元格C0 被填充单元格在所有方向上包围(任何方向上的填充单元格不需要是C0 的直接邻居),然后填充@ 987654324@.
一种天真的方法如下:-
对于每个单元格,沿 +X、-X、+Y、-Y、+Z、-Z 方向扫描,然后查看 如果您在每个方向都遇到一个填充的单元格。
如果在每个方向都遇到填充单元格,则填充此 细胞(因为它是某种形状内部的一部分)。
如果你在一个方向上到达网格的尽头而没有遇到任何填充 单元格,则所考虑的单元格不在任何形状的内部, 并且应该保持未填充。
上述方法的复杂度为O(n^4),其中3D网格的维度为n*n*n。
优化可能如下:-
如果对于一个未填充的单元格 C[x][y][z],我们遇到了一个已填充的单元格 每个在所有 6 个方向上,那么不仅 C[x][y][z] 需要 被填充,也保证我们扫描的所有单元格 刚才(即{在+X方向,所有单元格C[x][y][z],C[x+1][y][z], C[x+2][y][z], ..., 直到第一个填充的单元格},对于 -X,+Y,类似, -Y, +Z, -Z 方向)必须是某个形状内部的一部分,因此必须被填充。
另一个可能如下:-
如果对于未填充的单元格 C[x][y][z],我们不会遇到任何已填充的 比如说,+X 方向的单元格,那么不仅 C[x][y][z] 会保留 未填充,也保证我们扫描的所有单元格 刚才(即+X方向,所有单元格C[x][y][z], C[x+1][y][z], C[x+2][y][z], ..., 直到网格结束)必须是外部的一部分 因此,必须保持未填充。
有人可以提出一个更有效的方法来解决这个问题吗?即使是像上面这样可能不会降低时间复杂度的简单优化也是受欢迎的。
【问题讨论】:
-
找到 X、Y 和 Z 的极值有帮助吗?
-
你的空心形状有两个开口的边?喜欢this?
-
@PhamTrung 不。我描述的形状是封闭的空心形状,中间没有任何孔。
-
@Nullpointer,我没听明白。请详细说明。
-
所以你的问题有两个子问题:找到空心,然后填充它?
标签: algorithm data-structures matrix