📅  最后修改于: 2021-01-11 10:29:54             🧑  作者: Mango
河内塔,是一个数学难题,由三座塔(钉)和多个环组成,如图所示-
这些环的尺寸不同,并按升序堆叠,即,较小的环位于较大的环上。难题的其他变体是磁盘数量增加,但是塔数保持不变。
任务是将所有磁盘移动到另一个塔中,而不会违反排列顺序。河内塔需要遵循的一些规则是-
以下是用三个磁盘解决“河内之塔”难题的动画表示。
带有n个磁盘的河内之谜塔可以最少2 n -1步解决。此演示文稿显示具有3个磁盘的拼图已采取2 3-1 = 7步。
要为河内塔写算法,首先我们需要学习如何用较少的磁盘来解决此问题,例如→1或2。我们用名称,源,目标和辅助标记三个塔(仅用于帮助移动磁盘) )。如果我们只有一个磁盘,则可以轻松地将其从源钉移到目标钉。
如果我们有2个磁盘-
因此,现在我们可以为带有两个以上磁盘的河内塔设计一种算法。我们将磁盘堆栈分为两部分。最大的磁盘(第n个磁盘)在一部分中,所有其他磁盘(n-1)在第二部分中。
我们的最终目标是将磁盘n从源移动到目标,然后将所有其他(n1)磁盘放入磁盘。我们可以想象对所有给定的磁盘集以递归方式应用相同的内容。
遵循的步骤是-
Step 1 − Move n-1 disks from source to aux
Step 2 − Move nth disk from source to dest
Step 3 − Move n-1 disks from aux to dest
河内塔的递归算法可以如下驱动-
START
Procedure Hanoi(disk, source, dest, aux)
IF disk == 1, THEN
move disk from source to dest
ELSE
Hanoi(disk - 1, source, aux, dest) // Step 1
move disk from source to dest // Step 2
Hanoi(disk - 1, aux, dest, source) // Step 3
END IF
END Procedure
STOP
要检查C编程的实现,请单击此处。