前言
汉诺塔是一款有趣的智力游戏,其求解问题在数据结构与算法中也是堆栈思想和递归思想的典型案例。
一、何为汉诺塔
如图所示:有A、B、C三个杆,A杆上放有自上而下直径依次递增的圆盘,要将所有圆盘从A杆移动到C杆,并保持原来的叠放顺序,圆盘的放置可借助B杆,搬动时还需遵守以下规则:
1、直径较小的圆盘永远只能置于直径较大的圆盘之上。
2、圆盘可以任意的从任何一个木桩移动到其他的木桩上。
3、每次只能移动一个圆盘,而且只能从木桩最上面的开始移动。
二、问题分析
设有n个圆盘,对于汉诺塔的最小步数求解,进行一层抽象,无非是三个步骤:
1、将n - 1个圆盘,从A杆移动到B杆。
2、将第n个,即最大的圆盘,从A杆移动到C杆。
3、将n - 1个圆盘,从B杆移动到C杆。
当第n个圆盘移动到C杆,我们可以将B杆视为A杆,A杆视为B杆,重复步骤,因为此时第n个圆盘到达了目标位置,而前n - 1个圆盘都可放置于第n个圆盘之上,就可将归位的第n个圆盘视为无。
借助B杆,将第n个圆盘从A杆移动到C杆所需的最小步数为2n-1,依次类推,求解的最小步数就是一个等比数列的求和,解为2n - 1。
三、算法实现
代码如下(C#实现):
//求解汉诺塔问题中,移动n个圆盘的最少步骤过程
static void Hanoi(int n, string A = "A", string B = "B", string C = "C")
{
if(n == 1)
{
Console.WriteLine($"从{A}杆移动到{C}杆");
}
else
{
Hanoi(n - 1, A, C, B);
Console.WriteLine($"从{A}杆移动到{C}杆");
Hanoi(n - 1, B, A, C);
}
}