问题描述
有三个命名为x,y,z的塔座,x上有n个半径从小到大编号为1-n的圆盘,要求按相同顺序移动到z上,要求:
1)一次只能移动一个;
2)不可以将一个较大的圆盘压在较小的圆盘之上。
思路
先考虑特殊情况,n=1时直接移,n=2时先把上面一个移到辅助塔,再把另一个移到目标塔,再将第一个移到目标塔。同理,n>2时都可将类比为n=2的情形(将上面n-1个等效为“1”个就可)。由此,可将n个塔的问题转换为n-1个塔的问题,又可转换为n-2个塔的问题…最终转换为1个塔的问题。
算法实现
函数部分
void move(char x,int n,char z)
{
printf("将编号为%d的圆盘从%c移到%c上",n,x,z);
}//定义移动函数
void haoni(int n,char x,char y,char z)
{
if(n==1)
move(x,1,z)
else
{
haoni(n-1,x,z,y);//将1~n-1个圆盘借助z轴,从x轴移到y轴上
move(x,n,z);//将第n个圆盘从x轴移到z轴上
haoni(n-1,y,x,z);//将1~n-1个圆盘借助x轴,从y轴移到z轴上
}
}
//递归:算法的精髓部分
主函数
int main()
{
int n;
char x,y,z;
x='x';
y='y';
z='z';
scanf("%d",&n);
haoni(n,x,y,z);
return 0;
}