【汉诺塔问题】
设有3个命名为A、B、C的塔座,在塔座A上插有n个直径大小各不相同、依小到大编号为1,2…,n的圆盘。现要求将A轴上的n个圆盘移至塔座C上并仍按相同顺序叠排。
严版教材解析:
- 当n = 1时,只要将编号为1的圆盘从塔座A直接移至塔座C;
- 当n > 1时,需利用B作为辅助塔座,先将A上n-1个圆盘移动到B上,再将A上剩余的n号圆盘移动到C上,最后将B上的n-1个圆盘移动到C上。
而如何将n-1个圆盘从一个塔座移至另一个塔座的问题是一个和原问题具有相同特征属性的问题,只是问题的规模小1,因此可以用同样的方法求解。
#include<stdio.h>
int count = 0; //对移动次数进行计数
void hanoi(int n, char x, char y, char z)
{//将n个从小到大叠加在x柱子上的圆盘从柱子x移动到柱子z上,y为辅助柱子,
//移动期间小圆盘永远在大圆盘之上
if(n == 1)
printf("第%d次移动:move %c to %c\n", ++count,x,z);
else
{
hanoi(n-1,x,z,y); //先将n-1个圆盘移动到y柱子上
printf("第%d次移动:move %c to %c\n", ++count,x,z);//将x中剩下那个移动到z柱子上
hanoi(n-1,y,x,z); //最后想y中的n-1个圆盘移动到z柱子上
}
}
void main()
{
int n;
printf("请设置hanoi中圆盘的总个数:\n");
scanf("%d", &n);
hanoi(n,'A','B','C');
}