1)每次只能移动一个圆盘;
2)圆盘可以插在X、Y和Z中的任一塔座上;
3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
如何实现移动圆盘的操作呢?当n=1时,问题比较简单,只要将编号为1的圆盘从塔座X直接移至塔座Z上即可;当n>1时,需利用塔座Y作辅助塔座,若能设法将压在编号为n的圆盘之上的n-1个圆盘从塔座X(依照上述法则)移至塔座Y上,则可先将编号为n的圆盘从塔座X移至塔座Z上,然后再将塔座Y上的n-1个圆盘(依照上述法则)移至塔座Z上。而如何将n-1个圆盘从一个塔座移至另一个塔座的问题是一个和原问题具有相同特征属性的问题,只是问题的规模小1,因此可以用同样的方法求解。由此可得如下图算法所示的求解n阶Hanoi塔问题的C函数。
我们已经找到了将N-1个盘子从X移动到Z(借助Y)的方法了,现在我们将这N-1个盘从X移动到Y(借助Z) ,再将 第N个 移动到Z,再将Y上的N-1个盘移动到Z上(借助X)。
具体算法:
void hanoi(int n , char x,char y,char z)
{
if(n==1)
move(x,1,z); //就直接将x上 n 盘移动到z上
else
{
hanoi( n-1,x,z,y); //将x上编号为1至n-1的圆盘移动到y,z做辅助盘
move(x,n,z);
hanoi(n-1,y,x,z); //将y上编号为1至n-1的圆盘移动到z,x做辅助盘
}
}
void move(char x,int n,char z){
//搬动操作move(x,n,z) 可定义为(c是初值为0 的全局变量,对搬动技术)
printf("%i. Move disk %i from %c to %c \n", ++c,n,x,z);
}