📜  数据结构和算法-河内塔

📅  最后修改于: 2021-01-11 10:29:54             🧑  作者: Mango


河内塔,是一个数学难题,由三座塔(钉)和多个环组成,如图所示-

河内塔

这些环的尺寸不同,并按升序堆叠,即,较小的环位于较大的环上。难题的其他变体是磁盘数量增加,但是塔数保持不变。

规则

任务是将所有磁盘移动到另一个塔中,而不会违反排列顺序。河内塔需要遵循的一些规则是-

  • 任何给定时间只能在塔之间移动一个磁盘。
  • 只能删除“顶部”磁盘。
  • 大磁盘不能放在小磁盘上。

以下是用三个磁盘解决“河内之塔”难题的动画表示。

河内塔

带有n个磁盘的河内之谜塔可以最少2 n -1步解决。此演示文稿显示具有3个磁盘的拼图已采取2 3-1 = 7步。

算法

要为河内塔写算法,首先我们需要学习如何用较少的磁盘来解决此问题,例如→1或2。我们用名称,目标辅助标记三个塔(仅用于帮助移动磁盘) )。如果我们只有一个磁盘,则可以轻松地将其从源钉移到目标钉。

如果我们有2个磁盘-

  • 首先,我们将较小的(顶部)磁盘移至辅助钉。
  • 然后,我们将较大的(底部)磁盘移动到目标挂钉。
  • 最后,我们将较小的磁盘从aux移到目标钉。

河内塔与两个磁盘

因此,现在我们可以为带有两个以上磁盘的河内塔设计一种算法。我们将磁盘堆栈分为两部分。最大的磁盘(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编程的实现,请单击此处