问题描述:假设有3个分别命名为X、Y和Z的塔座,在塔座X上插有n个直径大小各不相同、按从小到大编号为1,2,…,n的圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则:
(1)每次只能移动一个圆盘;
(2)圆盘可以插在X、Y和Z中的任一塔座上;
(3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
请问如何移?要移多少次?
#include <stdio.h>
long count; //移动的次数
void hanoi(int n,char a,char b,char c) //汉诺塔算法
{
if(n==1)
{
printf("第%d次移动: 圆盘从%c棒移动到%c棒\n",++count,a,c);
}
else
{
hanoi(n-1,a,c,b); //递归调用
printf("第%d次移动: 圆盘从%c棒移动到%c棒\n",++count,a,c);
hanoi(n-1,b,a,c); //递归调用
}
}
void main( )//主函数
{
int n; //圆盘数量
count=0;
printf("汉诺塔问题求解!\n");
printf("请输入汉诺塔圆盘的数量:");
scanf("%d",&n);
hanoi(n,'A','B','C'); //求解
printf("求解完毕!总共需要%ld步移动!\n",count);
}
输入和运行结果如下: