这种类型的问题对我来说实在是棘手。 我有一个网格形式的图形,如下所示。
A-----B-----C-----D
| | | |
E-----F-----G-----H
| | | |
I-----J-----K-----L
| | | |
M-----N-----O-----P
现在,那是一个有效的图形,如果我问平方数是多少,我应该计算单位平方并回答9。
A-----B-----C-----D
| | |
E-----F G H
| |
I J K L
| |
M-----N-----O-----P
那是无效的图形,因为它包含一个1x1正方形与一个3x3正方形重叠。在这种情况下,它重叠在一个角上,但通常可以是FGJK或BFJKLHDC。那些也是无效的。
我的问题是,如何验证图形具有不重叠的正方形,接下来,如何计算有效图形中的正方形?
此外,没有悬空的边缘,每个边缘必须是正方形的一部分。
到目前为止,我的方法是: 1.找到给定边的最大可能正方形。 M号 2.找到给定边的最小可能平方。尺寸N。 3.检查N是否是M的因数,并检查M方格是否被N方格完全平铺。
我被困的区域: 我无法使用动态编程来创建算法。我创建的算法是O(n ^ 6),我对此感到很to愧,无法在此处发布。
申请领域: 对象共振。请不要问最初的问题,因为我没有发言权。
答案 0 :(得分:0)
我的问题是,如何验证图形具有不重叠的正方形,接下来,如何计算有效图形中的正方形?
我对此了解如下:
让n
为网格侧面的顶点数。在您的情况下(n = 4),正好有3种有效配置(最多对称):
A-----B-----C-----D A-----B-----C-----D A-----B-----C-----D
| | | | | | | | | |
E-----F-----G-----H E-----F-----G-----H E F G H
| | | | | | | | |
I-----J-----K-----L I-----J K L I J K L
| | | | | | | | |
M-----N-----O-----P M-----N-----O-----P M-----N-----O-----P
我对第一个问题建议的方法如下:首先,像这样为每个图块分配一个数字:
A-----B-----C-----D
| 1 | 2 | 3 |
E-----F-----G-----H
| 4 | 5 | 6 |
I-----J-----K-----L
| 7 | 8 | 9 |
M-----N-----O-----P
然后创建属于同一分区的图块集。例如,在第二种配置(侧面2的一个正方形和侧面1的5个正方形)中,将具有以下6组:{1}, {2}, {3}, {4}, {5, 6, 8, 9}, {7}
。现在进行验证:
1
的组会自动验证4
,{k}, {k+1}, {k+n-1}, {k+n}
的集的格式必须为k
S^2
的集合的格式必须为{ k+i+(n-1)j | 0<=i<S, 0<=j<S }
的{{1}} 此验证步骤实际上可以在您解析图块升序并在处理时对其进行标记时完成:下一个未标记图块k
必须在正方形的左上角:检查图块连接到k
的对象形成一个集合,如上面的验证条件所述(通过查找连续图块之间是否没有边来检查平铺连接)。这样,如果您发现分区不是正方形,则可以中止该程序。
如果所有分区都经过验证,则平方数就是您找到的集合数(在示例情况下为6)。
最后一件事是“悬空边缘”问题:只需检查所有顶点的度数至少为k
。可以在算法开始时完成此操作,或者根据您编写“平方验证”过程的方式,可能没有必要。
该程序的整体时间复杂度看起来为2
,其中O(n^2)
是网格的一面,因此它实际上按照图的顺序(顶点数)是线性的。当您提到n
的复杂性时,我不确定O(n^6)
是什么。