n阶Hanoi塔问题
Hanoi塔问题规则
- 每次只能移动一个圆盘;
- 圆盘可以插在X、Y和Z中的任一塔座上;
- 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
如下所示是一个3阶的Hanoi塔演示(从左至右依次为X、Y、和Z塔):
x | y | z |
---|
动态演示通过ppt录屏演示,有一定缺陷,望见谅
Hanoi塔分析
-
是n=1阶汉诺塔时,将唯一的圆盘从塔座X直接移至塔座Z。
-
当n>1时(动图展示为n=3),需要利用Z作为辅助塔,总是设法将X塔的最后一个圆盘n移动到Z塔下,则必然要将1到n-1个圆盘移动到Y塔上
- 此时Y塔作为最初的X塔的状态,X塔作为Z塔的最初状态,X塔是辅助塔,应该将当前Y塔下的最后一个圆盘n-1移动到Z塔上
- 若n>3,则不断在2.和3.循环执行,直到将所有的圆盘全部移动到Z塔上
- 当还剩最后一个圆盘时,则执行第一个步骤,直接将圆盘移动到Z塔.
如上步骤一般,当n>1总是在步骤2 3重复,且Z塔与X塔交换着成为辅助塔。所以我们可以用递归来处理这种重复的步骤。
void hanoi(int n, char x, char y, char z) {
if(n == 1) { // 最后一个圆盘
move(x, 1, z); // 将最后一个圆盘从x移到z
} else {
hanoi(n - 1, x, z, y); // 将x上编号为1至n-1的圆盘移到y,z是辅助塔
move(x, n, z); // 将编号为n的圆盘从x移到z
hanoi(n - 1, y, x, z); // 将y上编号为1至n-1的圆盘移动到z,x是辅助塔
}
}