【题目】
设 A,B,C 是三个塔座。开始时,在塔座 A 上有 n个圆盘,这些圆盘自下而上,由大到小地叠放``一起,各圆盘从小到大编号为1,2,...,n。现在要将 塔座 A 上的这一叠圆盘经由塔座 B 移动到塔座 C ,并仍按同样的顺序叠置,最少需要多少次?
移动规则:
- 一次只能移动一个盘子;
- 大的盘子不能压在小盘子上;
- 满足前面两项规则的前提下,可将盘子移至 A、B、C 中任一柱子上;
【算法思想】
当n=1时,将圆盘直接移到C塔座上;
当n=2时,将小的圆盘移到B塔座上,将大的圆盘移到C塔座上;
当n>2是,将n个叠在一起的圆盘分成两组:
[1]:最大的那个圆盘自己作为一个组;
[2]:除去那个最大的圆盘,叠在最大的那个圆盘上面的n-1个圆盘可视为一个组。
通过分组,我们的问题将变得非常的容易解决啦!!!
第一步,借助辅助塔座B,我们将塔座A上面的n-1个圆盘(即第二个分组)移到塔座B 上(顺序依然同塔座A 一样)
第二步,将塔座A 上最大的那个圆盘移到塔座C上
第三步,将塔座B上的圆盘也分成两组(分组方法同上),借助辅助塔座A,将塔座B上面的n-1个圆盘移动到塔座A上,然后将塔座B上剩余的那个最大的圆盘移到塔座C上
不断重复上述操作,直至圆盘全部按顺序叠置到塔座C上。
【示例】
有三个塔座分别是A、B、C,塔座A上有3个圆盘,现要借助塔座B ,将塔座A上的3个圆盘移到塔座C上:
【C++代码实现】
#include<iostream>
using namespace std;
void Hanoi(int n, char A, char B, char C)
{
if (n == 1)
{
printf("%c -> %c\n", A, C);
}
else
{
Hanoi(n - 1, A, C, B);
printf("%c -> %c\n", A, C);
Hanoi(n - 1, B, A, C);
}
}
int main()
{
Hanoi(3, 'A', 'B', 'C');
return 0;
}