如果我有如下列表,
[[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]]
我想在python中编写一个程序,它检测连接点形成的方块数。
我知道有一个图表遍历,当我们遍历图表时,可以跟踪每个被访问节点。但在这种情况下,没有提到方向。
我不是在这里要求一个完整的解决方案,也不是我没有充分研究过的情况。关于如何处理这个问题的任何建议都会有所帮助,因为我无法开始这个。
提前谢谢。
答案 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,不要必须检查所有方面。它应该更快。