【问题标题】:algorithm to find square chained permutations寻找方链排列的算法
【发布时间】:2011-12-17 01:27:17
【问题描述】:

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

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 2 3?
  • @MitchWheat 看起来我们很困惑,他得到了两种类型的选票。
  • 为什么要关闭投票? OP 已经有两种解决方案了?
  • 为什么说回溯方法只是“稍微”好一点?没有彻底分析它,也许你已经分析过了,我猜这种方法会比原来的方法快得多。

标签: algorithm permutation


【解决方案1】:

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

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

制作一次图表,也许你可以调整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 更快。

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

【讨论】:

  • +1 好主意。不过,您能否在此图中有效地找到解决方案?
  • 我认为该图需要进行一些修正:节点 10 连接到节点 15,而不是节点 5。节点 15 将形成返回节点 1 的电路。此外,节点 3 连接到节点 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]
猜你喜欢
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
相关资源
最近更新 更多