找到方链排列的算法

时间:2011-12-17 01:27:17

标签: algorithm permutation

如果连续数的总和始终是完美的平方,则排列是方形链。例如,

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

是数字1到16的平方链排列。我想编写一个程序来查找数字1到n的方形链式排列,n从1到100。

最简单的做法是按字典顺序排列n的所有排列(我知道如何写这个)并检查方形链条件,但这需要很长时间才能达到n大。

稍微好一点的方法是一次一个地选择我的排列中的数字,检查以确保我刚刚选择的数字在添加到前一个数字时形成一个正方形,并希望我将其设置到最后。不过,我必须备份很多,而且我认为它不会非常有效。

有更好的方法吗?另外,这是一个众所周知的问题吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:6)

有趣的问题;我会开枪。将问题重新表述为TSP

制作一个图表,其中节点是从1到100的整数(您考虑的最大n)。如果i是完美的正方形,请立即连接ji+j。问题是:“节点1n之前是否有Hamiltonian path?”

制作一次图表,也许您可​​以在i包含i+1之后调整 13 --(25)-- 12 --(16)-- 4 --(9)-- 5 --(16)-- 11 | | (16) (25) | | 8 --(9)-- 1 --(4)-- 3 --(9)-- 6 --(16)-- 10 14 | (16) | 9 --(16)-- 7 --(9)-- 2 的路径。

这是最多14的图表:

    12  11  10  09  08
13
                    07
14
                    06
15
                    05
    01  02  03  04

图表在添加14之前没有连接,甚至在添加14之后也没有哈密顿路径。这是一个可爱的方式来绘制图形,其中添加了15个图表,可以很容易地显示16和17然后仍然具有汉密尔顿路径:

n

在方格纸上绘制并连接对角线和反对角线(例如12-13,14-11,...和09-07,10-06,...),它们是添加的方式成对得到9或16.这里,我忽略了1和3之间的边缘,因为它没有帮助。想象一下,沿着对角线从8到1射击一个球,当它击中一个数字时,它会以直角反弹。球传到你给出的哈密尔顿路径(16分掉线)。

要获得16的路径,只需将其添加到左下角即可。要获得17,将其固定在球进入8的路径上。

有一些合理的算法可以找到汉密尔顿路径,这种方法很可能比根据你建议的方法检查每个n <= 25更快。

我发现n > 24只有15,16,17,23,25的解决方案存在。瞧,看哪! This sequence is in OEIS。根据该页面,推测所有{{1}}都存在解决方案,所以显然这个问题是已知的,尽管我不一定称之为众所周知。