河内塔的通用解决方案,杆数可变?

时间:2012-07-03 05:41:28

标签: algorithm optimization puzzle

考虑到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”。但是我们如何决定将它放在哪里呢?

就我而言。我可以写一个递归算法来尝试所有可能的地方,但我不确定这是否是最佳的。

1 个答案:

答案 0 :(得分:2)

我们不能。

更确切地说,正如http://en.wikipedia.org/wiki/Tower_of_Hanoi#Four_pegs_and_beyond所述,对于4个以上的钉子,证明最佳解决方案是一个开放的问题。有一种已知的非常好的算法,被广泛认为是最佳的,对于简单的情况,一堆磁盘在一个挂钩上并且你想将整个堆转移到另一个。但是,对于任意起始位置,我们没有算法,甚至没有已知的启发式算法。

如果我们确实有一个提议的算法,那么开放问题可能会容易得多。

相关问题