如何检查网格上的选定单元格是否形成“隧道”?

时间:2012-04-13 18:52:08

标签: algorithm language-agnostic grid

给定一个网格图,其中每个单元格可以由一对(x, y)描述,以及这些单元格的向量,我怎样(很好地)检查该向量中的单元格是否形成“隧道”,即。它们是所有垂直还是水平排列?但是如果我只想知道大多数是否排成一行(而不是所有)该怎么办?

All are lines up             Most are lined up      Not lined up

                             C                       C C C
 C C C C C C C C             C C C C C C C C         C   C C C
                                 C                   C C C C
                                                         C C

3 个答案:

答案 0 :(得分:2)

您可以对细胞的x和y坐标进行直方图。 如果所有单元格都是水平排列的,则直方图中只有一个y值和许多连续的x值,这些值都只出现一次。垂直方向与x和y翻转相同。

如果要检查,如果大多数都排成一行,请搜索直方图中的值,该值最常出现(隧道最长)并检查具有该x或y坐标的单元格(如果它们是排队(即:他们的y或x坐标(取决于前一步骤中使用的x或y)是连续的没有间隙(可能先排序)) 如果不是,请搜索第二高的出现值,......

答案 1 :(得分:1)

首先检查他们的y坐标是否相等,然后按x坐标排序并从左到右遍历以检查间隙,可以检查他们是否制作水平隧道。使用相反的坐标检查垂直隧道。

对于近似检查,您必须澄清“最”的含义。

答案 2 :(得分:1)

您可以计算X和Y坐标的standard deviation。细胞越“隧穿”,对于X或Y,std偏差越小。

例如,在Python中:

import numpy

def is_tunnelled(cells):
    # given cells=[(x,y), (x,y),...]
    x_values, y_values = zip(*cells)
    lowest_std_dev = min(numpy.std(x_values), numpy.std(y_values))
    return lowest_std_dev < STD_DEVIATION_THRESHOLD

由您决定STD_DEVIATION_THRESHOLD的值应该是什么。