Algorithm 求平方链排列的算法
如果连续数之和始终是完美平方,则排列是平方链排列。比如说, 8115106313124511141427916 是数字1到16的平方链排列。我想写一个程序来找到一个1到n的正方形链式排列,对于n,从1到100 最简单的方法是按字典顺序遍历n的所有排列(我知道怎么写),并检查平方链条件,但这需要n big的时间 一个稍微好一点的方法是在我的排列中一次选择一个数字,检查以确保我刚刚选择的数字在添加到前一个数字时成为一个正方形,并希望我能做到最后。不过,我需要做很多备份,而且我认为这样做效率不高Algorithm 求平方链排列的算法,algorithm,permutation,Algorithm,Permutation,如果连续数之和始终是完美平方,则排列是平方链排列。比如说, 8115106313124511141427916 是数字1到16的平方链排列。我想写一个程序来找到一个1到n的正方形链式排列,对于n,从1到100 最简单的方法是按字典顺序遍历n的所有排列(我知道怎么写),并检查平方链条件,但这需要n big的时间 一个稍微好一点的方法是在我的排列中一次选择一个数字,检查以确保我刚刚选择的数字在添加到前一个数字时成为一个正方形,并希望我能做到最后。不过,我需要做很多备份,而且我认为这样做效率不高 有更
有更好的办法吗?还有,这是一个众所周知的问题吗?谢谢你的帮助。有趣的问题;我要试一试。将问题重新表述为一个问题 制作一个图,其中节点是1到100之间的整数(您考虑的最大值
n
)。现在连接i
和j
,如果i+j
是一个完美的正方形。问题是,“是否有一个直通节点1
到n
?”
制作一次图形,也许你可以调整i
的路径,一旦你将它包含在i+1
中
以下是截至14日的图表:
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,图才连通,即使加上14,也没有哈密顿路径。这里有一个可爱的方法来绘制添加了15的图表,它简单地展示了如何在仍然有哈密顿路径的情况下加上16和17:
12 11 10 09 08
13
07
14
06
15
05
01 02 03 04
将其绘制在图表纸上,并连接对角线和反对角线(例如12-13、14-11……和09-07、10-06……),它们是将对相加得到9或16的方法。在这里,我忽略了1和3之间的边缘,因为它没有帮助。想象一下,沿着对角线从8到1射出一个球,当它击中一个数字时,它会以直角反弹。球沿着你给出的哈密顿路径运动(落下16个球)
要获得16的路径,只需将其添加到左下角。要获得17分,将球钉在球进入8分的路径上
有合理的算法可以找到哈密顿路径,这种方法很可能比基于您建议的任何一种方法检查每个n
都要快
我计算出了
n24
,所以显然这个问题是已知的,尽管我不一定称它为众所周知的。它保证存在吗。。例如,12 3?@MitchWheat我们似乎很困惑,他得到了两种类型的选票。为什么选票接近?OP已经有两种解决方案了?为什么你说回溯方法只是“稍微”好一点?如果没有对它进行彻底的分析(也许你已经分析过了),我想这种方法会比最初的方法快得多。但是,你能在这个图中有效地找到解决方案吗?我认为这个图需要一点修正:节点10连接到节点15,而不是节点5。节点15将形成回节点1的电路。另外,节点3连接到节点13,然后节点13连接到节点12。@Glenn谢谢。Ascii艺术不是我的强项。@templatetypedef定义“高效”;-)看看例子,也许吧,但事实上证明所有n>25的人都有一条路是一个公开的问题,这让我觉得如果有,这并不容易。节点和边1:[3,8,15]2:[7,14]3:[1,6,13]4:[5,12]5:[4,11]6:[3,10]7:[2,9]8:[1]9:[7,16]10:[6,15]11:[5,14]12:[4,13]13:[3,12]14:[2,11]15:[1,10]16:[9]