有三根杆子A,B,C。A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:
1、每次只能移动一个圆盘;
2、大盘不能叠在小盘上面。
提示:可将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
算法求解:
解法的基本思想是递归。假设有 A、B、C 三个塔,A 塔有N块盘,目标是把这些盘全部移到 C 塔。那么先把 A 塔顶部的N-1块盘移动到 B 塔,再把 A 塔剩下的大盘移到 C,最后把 B 塔的N-1块盘移到 C。
如此递归地使用下去, 就可以求解。1
2
3
4
5
6
7
8
9
10
11
12void hannoi (int n, char from, char buffer, char to)
{
if (n == 0)
{
return;
}
hannoi (n - 1, from, to, buffer); //那么先把 A 塔顶部的N-1块盘移动到 B 塔
cout << "Move disk " << n << " from " << from << " to " << to << endl;
hannoi (n - 1, buffer, from, to); //A 塔剩下的大盘移到 C,最后把 B 塔的 N-1块盘移到 C。
}