汉诺塔问题发源于古老的梵天寺之塔仪式,传说当世界诞生的时候,有一座摞了64个黄金碟子的钻石塔(记为A塔)。碟子按从大到小的次序自底向上地摞在塔上。除此之外还有两个钻石塔(记为B和C塔),从世界诞生之日开始,梵天寺的僧侣们就通过塔C将碟子从A塔搬到B塔,但每次只能搬一个碟子,并且任何时候都不能大的碟子在上小碟子在下。根据传说,当僧侣完成任务是就是世界毁灭之时。
这个问题可以用递归来解决。假设碟子数是n个,为了将最大的第n个从A搬到B,需要先将剩下的n-1个碟子搬到C上,我们需要解决的问题就是如何将塔C上的碟子搬到塔B上。此时我们可以用塔A和B,可以先不管B上已有的碟子,因为它是最大的,其他碟子都可以放在它上面。这时就可以用递归算法。改程序首次调用是TowersOfHanio(n,A,B,C).即将一个搬运n个碟子的问题转换为两个搬动n-1个碟子的问题。
#include<iostream>enum tower{A = 'A',B = 'B',C = 'C'};void TowersOfHanoi(int n,tower X,tower y,tower z)//从塔x的顶部移动n个碟子到塔y { if(n) { TowersOfHanio(n-1,x,z,y); cout<<"move top disk from tower"<<char(x)<<"to top of tower"<<char(y)<<endl; TowersOfHanio(n-1,z,y,x); } }
新闻热点
疑难解答
图片精选