考虑到D盘,P极和磁盘的初始起始位置,以及极点所需的最终目的地,我们如何编写这个问题的通用解决方案?
例如,
给定D = 6且P = 4,初始起始位置如下:
5 1
6 2 4 3
如果数字表示磁盘的半径,则磁极的编号为1-4左右,我们希望将所有磁盘堆叠在磁极1上。
我们如何选择下一步行动?
解决方案是(手工制作):
3 1
4 3
4 1
2 1
3 1
(格式:<from-pole> <to-pole>
)
第一步显而易见,将“4”移到“5”之上,因为它在最终解决方案中所需的位置。
接下来,我们可能想要移动下一个最大的数字,即“3”。但首先我们必须取消它,这意味着我们应该移动“1”。但是我们如何决定将它放在哪里呢?
就我而言。我可以写一个递归算法来尝试所有可能的地方,但我不确定这是否是最佳的。
答案 0 :(得分:2)
我们不能。
更确切地说,正如http://en.wikipedia.org/wiki/Tower_of_Hanoi#Four_pegs_and_beyond所述,对于4个以上的钉子,证明最佳解决方案是一个开放的问题。有一种已知的非常好的算法,被广泛认为是最佳的,对于简单的情况,一堆磁盘在一个挂钩上并且你想将整个堆转移到另一个。但是,对于任意起始位置,我们没有算法,甚至没有已知的启发式算法。
如果我们确实有一个提议的算法,那么开放问题可能会容易得多。