云木集成墙面无缝板:N阶Hanoi问题求解

来源:百度文库 编辑:神马品牌网 时间:2024/05/07 07:35:35
问题描述
设有三个塔座分别为X,Y ,Z。先有N个直径各不相同的圆盘,且按直径从小到大编号为1,2,3……。开始时都放在X上。现在要按以下规则移动盘子。
1.每次只能移动一个。
2.Y可作为中间柱。
3.移动过程中不能出现大盘压小盘的情况

不对,C语言书上是移动3个盘子,这个问题是要移动N个盘子。呵呵!
现给出一个参考答案,用C++描述的:

问题分析
如果N=1,则移动X到Z,结束。
如果N!=1,则设法将N-1个移动到Y,再将第N个移动到Z,再将N-1个移动到Z。
所以,这是一个可以用递归算法解决的问题。

算法描述
PROCEDURE Ahanoi(n,x,y,z)
IF n=1 THEN move(x,1,z)
ELSE
{Ahanoi(n-1,x,z,y)
move(x,n,z)
Ahanoi(n-1,y,x,z)
}
RETURN

程序代码
#include <iostream.h>
void move(char x,char y)
{cout<<x<<"-->"<<y<<"\n";}
void hanoi(int n,char one,char two,char three)
{ if(n==1) move(one,three);else{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);}
}
main()
{
int m;
cout<<"Input the number of disks:"<<"\n";
cin>>m;
cout<<"The step to move"<<m<<"disks"<<"\n";
hanoi(m,'A','B','C');
return 0;
}

已经调试通过!

简单,用递归法。
分2情况。
C语言书上有