如您所知,有一些方法可以解决河内塔,但是他们要求所有磁盘在开始时都在一个塔中。
现在我想知道有什么方法可以解决这个问题,其中磁盘在开始时已经在塔之间随机分布。
答案 0 :(得分:8)
是的,它仍然可以解决(假设较小的磁盘顶部没有大磁盘)。 例如:
1
4 2
6 5 3
-------------
找到包含1的最大连续堆栈。这里,它是{1,2}。将该堆栈移动到下一个最大的磁盘上,忽略其他任何磁盘。您可以使用标准Tower of Hanoi算法进行此步骤。
1
4 2
6 5 3
-------------
重复上述步骤。包含1的下一个连续堆栈现在是{1,2,3}。将其移至4
1
2
3
4
6 5
-------------
同样的事情 - 将{1,2,3,4}移到5。
1
2
3
4
6 5
-------------
现在将{1,2,3,4,5}移到6,你已经完成了。如果您需要将整个堆栈移动到特定的挂钩,请再次使用标准解决方案。
答案 1 :(得分:0)
我也没有专家,但是考虑到这个问题,考虑到三个堆栈AB和C,并且作为一个前提,6个磁盘必须在堆栈C中完成,就像河内最传统的塔一样,用43解决了这个问题动作。我不知道这是否是最佳解决方案,但有一个非常有趣的网站可能会看到 here
答案 2 :(得分:0)
任何法律安排的解决方案都遵循相同的模式。解决方案中只有两种步骤:
要将磁盘移动到一个挂钩上,要么磁盘已经挂在挂钩上而且你已经完成,或者磁盘不在挂钉上,并且只有一种方法可以完成此步骤:
要将给定磁盘和所有较小磁盘移动到特定挂钩,实现此目标的唯一方法是按顺序执行以下两个步骤
答案 3 :(得分:0)
你的问题破坏了我的工作效率!
我只是花了我宝贵的时间来回答它,结果就是这样:
首先,您必须计算每个磁盘想要的位置,从最大到最小。有三个简单的规则可供遵循:
N+1
想要从LEFT
转到MIDDLE
,则N
想要转到RIGHT
。N+1
停留在RIGHT
,N
想要转到{{ 1}})。然后将最小的磁盘移动到所需的位置,该磁盘不希望保持其挂钩。 (编辑:或者,你可以移动你遇到的第一个想要执行合法移动的磁盘,但这意味着你的代码有一个合法移动的概念)
迭代直到解决。
让我们来看看贾斯汀的例子。
RIGHT
| | |
| | |
| | |
| 1 |
4 2 |
6 5 3
想要从6
转到LEFT
(规则1)。RIGHT
想要从5
转到CENTER
(规则2)。CENTER
想要从4
转到LEFT
(规则3)。CENTER
想要从3
转到RIGHT
(规则2)。RIGHT
想要从2
转到CENTER
(规则3)。RIGHT
想要从1
转到CENTER
(规则2)。第一步必须将磁盘1放在左侧挂钉上(最小的磁盘不想留在原位)。
接下来的行动将如下所示:
LEFT
我实施了这些规则,它们适用于任何初始塔(包括常规的全左塔)。而且,他们总是采取最短的路径。
YAY!一种解决河内塔的非递归方式!
答案 4 :(得分:0)
从较大的光盘开始在较小的光盘上开始时,获得解决方案没有任何限制(例如,光盘的顺序可能相反,底部最小,因此解决方案很简单)。它的确使问题变得更加有趣,但难题确实在某些时候开始看起来像一堆较大的光盘和较小的光盘。要移动常规的从小到大的桩以完成重新排序,通常需要进行2次移动。如果要移动的光盘数量是奇数,请先将顶部(即最小)的光盘移动到所需位置,再将下一个最小的光盘移动到另一个钉子,然后将最小的光盘放在上面,再将下一个光盘放在如果要移动的光盘数量是偶数,则应将最小的光盘移动到不是所需位置的销钉上。当光盘以随机大小顺序排列时,可能会有一些捷径,也可能会有一些并发症,但难题仍然可以解决。我应该补充一点,随机开始游戏的目的仅仅是在任何钉子上以正确的大小顺序获取光盘,但是很显然,可以应用常规的递归算法将这样的堆栈移动到任何钉子上。