题目
菱形塔(假设为A)上有64个金圆盘,尺寸依次减小。圆盘按照尺寸从大到小的顺序自底向上排列。除了A塔外,还有另外的B塔和C塔。现在利用C塔作为中间存放容器,将A塔上面的圆盘移动到B塔上。每次只能移动一个,且不允许将圆盘放置在尺寸比它更小的圆盘之上。
分析
此问题可以通过递归予以解释。假设A上的圆盘数为n,要将A上最大的圆盘置于B的底部,首先需要将n-1个圆盘置于C塔上,然后将最大的圆盘移动到B。剩下的任务即是将C塔上面的n-1个圆盘移动到B塔上。因为现在B塔底部的圆盘大于所有C塔上的圆盘,故可以忽略不计。于是形成一个递归问题。
设函数Hanoi(int n,char A,char B,char C)
其中n为初始A塔上的圆盘数。Hanoi函数的目的是将这n个圆盘从A移动到B。
程序
#include "iostream"
using namespace std;
void Hanoi(int n, char A, char B, char C)
{
if (n > 0)
{
Hanoi(n - 1, A, C, B);//先将n-1个圆盘从A移动到C
cout << "move top disk from tower " << A << " to top of tower " << B << endl;//将A底部最大的圆盘从A移动到B
Hanoi(n - 1, C, B, A);//最后将C上的n-1个圆盘移动到B
}
}