Python - 通过连接坐标查找正方形的数量

时间:2018-05-30 08:27:14

标签: python

如果我有如下列表,

[[1, 2], [3, 4], [1, 5], [2, 6], [4, 8], [5, 6], [6, 7],
 [7, 8], [6, 10], [7, 11], [8, 12], [10, 11],
 [10, 14], [12, 16], [14, 15], [15, 16]]

另一个清单如下:

([[1, 2], [2, 3], [3, 4], [1, 5], [4, 8],
     [6, 7], [5, 9], [6, 10], [7, 11], [8, 12],
     [9, 13], [10, 11], [12, 16], [13, 14], [14, 15], [15, 16]] 

上述2个列表可以在图像中可视化,其中每个点由列表表示。  enter image description here

我想在python中编写一个程序,它检测连接点形成的方块数。

我知道有一个图表遍历,当我们遍历图表时,可以跟踪每个被访问节点。但在这种情况下,没有提到方向。

我不是在这里要求一个完整的解决方案,也不是我没有充分研究过的情况。关于如何处理这个问题的任何建议都会有所帮助,因为我无法开始这个。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

考虑到边长,在这种情况下它是3,内部的正方形是有限的,可以像输入一样描述为边列表。

在你的情况下,里面有9个(1 * 1)正方形,4个(2 * 2)正方形和1个(3 * 3)正方形。 第一个(1 * 1)方块可以描述为{(1,2), (1,5), (2,6), (5,6)}。 我在这里使用元组而不是列表,因为元组可以是python中set的元素,而list不能。如果我们像这样转换输入,我们得到图表

{(1, 2), (3, 4), (1, 5), (2, 6), (4, 8), (5, 6), (6, 7),
 (7, 8), (6, 10), (7, 11), (8, 12), (10, 11),
 (10, 14), (12, 16), (14, 15), (15, 16)}

第一个方格{(1,2), (1,5), (2,6), (5,6)}是图集的子集(我们可以使用python函数issubset来检查),然后我们可以说它在图中。使用相同的方法检查图中是否所有14个方格都得到了数字。

如果边长很大,比如100,你可以使用一个循环来获得所有可能的方格。

for point in all_points:
    for side_length in range(1, N):
        if the_square_is_valid:
            gen_the_side_set

正如tiboas_k评论的那样,算法的复杂性很高。 我刚刚提出了一个新的解决方案。

首先将输入转换为

{(1, 2), (3, 4), (1, 5), (2, 6), (4, 8), (5, 6), (6, 7),
 (7, 8), (6, 10), (7, 11), (8, 12), (10, 11),
 (10, 14), (12, 16), (14, 15), (15, 16)}

如上所述。然后得到所有可能的左上节点,它是边对的第一个元素的集合。

 {1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 15}

对于每个可能的左上节点,检查输入图中是否存在以此节点为左上节点的长度为1,2 ... n的平方。它可以优化,对于长度k,如果缺少顶侧或左侧,则不需要检查k + 1到n。

在这个算法中,我们不需要生成所有可能的正方形,只需检查输入图中的所有可能的正方形,一旦我们发现一侧缺失,我们就可以返回false,不要必须检查所有方面。它应该更快。