汉诺塔算法

1问题描述 
问题提出:有三个塔(分别为A号,B号和C号)。开始时.有  n个圆形盘以从下到上、从大到小的次序叠置在A塔上。现要将A  塔上的所有圆形盘,借助B搭,全部移动到C搭上。且仍按照原来  的次序叠置。 
移动的规则如下:这些圆形盘只能在3个塔问进行移动.一  次只能移动一个盘子,且任何时候都不允许将较大的盘子压在比  它小的盘子的上面。 
要求如下:从键盘输入初始圆形盘子个数n.实现n  个盘子最佳移动的全过程。 
2算法分析 
       此题的目的是设计一个盘子移动的方案.使得A号塔上的所 有盘子借助于B号塔按照原来的次序移动到C号塔上,并且.要  给出完整的最佳的盘子移动的方案。  我们从实际的、具体的盘子的移动过程来分析.找出问题内  在的规律。经分析无论盘子的个数有多少.是1、2、3..或n个.  也不管我们怎么去移动盘子(当然是按规则来移动).但在移动的 过程中,将始终会出现这样的状态情况:(n一1)个盘子将会以从下  到上、从大到下的次序叠置在B塔上,这时,A塔上第n个盘子就 能被轻而易举叠放到c塔上;接着,我们再把B塔上的n-1个  盘子移动到C塔上,问题好像已经解决  但,B塔上(n—1)个盘子怎么移动到C塔上呢?这是我们要解  决的第二个问题。同样,不管我们怎么移动,也将会出现这样的状  态情况:(n一2)个盘子将会以从上到下、从大到小的次序叠置在A  塔上,这时。B塔上第(n一1)个盘子就能被轻而易举放到C塔上;接  着,我们把A塔上的共(n一2)个盘子移动到C塔上。  这样,不断深入,不断细小化,最终,将到达仅有一个盘的情 形。这时,递归也就终止了,问题也得到了解决。通过以上分析.这  里有很明显递归关系  由此,想到了采用递归算法来解决该问题。因为递归算法有这  样特征描述:为了求解出规模力N的问题的解.我们先设法将它分 解成一些规模较小的问题,后从这些较小问题的解能方便地构  造出大问题的解,并且这些规模较小的问题也能采用同样的方法  分解,分解成规模更小的问题,并能从这些更小的问题的解构造出  规模稍大问题的解。特别地是,当规模N-I时,能直接得到解。  现在,严格按照递归算法来解决问题。先定义递归方法Hanio 
(int N,char A,char B,char C),按如下步骤进行解题(设初始盘子个 数为N):若A塔上仅仅只有一个盘子(N=1),则直接从A移动到 C,问题完全决。若A塔上有一个以上的盘子(N>1),则需要考虑以下三个步骤。  第一步:把 一1)个盘子从A塔经过移动,叠放到B塔上。在  不违反规则情况下,所有fN一1)个盘子不能作为一个整体一起移  动,而是要符合要求地从一个塔移到另一个塔上。用Hanio(N—1.A,  C,B)调用递归方法,注意:这里是借助于C塔,将(N一1)个盘子从A  塔移动到B塔,A是源塔,B是目标塔。  第二步:将剩下的第N个盘子(也就是最底下的一个)直接从A塔  叠放到空着的C塔上。 

第三步 用第一步的方法,再次将B塔上的所有盘子叠放到 C塔上。同样,这一步实际上也是由一系列更小的符合规则的移动 盘子的操作组成的。用Hanio(N一1,B,A,C)调用递归方法,注意:这 里是借助于A塔,将(N—1)个盘子从B塔移动到C塔,B是源塔,℃ 是目标塔。 这个算法达到了预期的目标.即在C塔上按正确的次序叠放 了所有的圆形盘子。

如果单纯是求步骤数的话,利用An = 2*An-1 + 1 既可以算出



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值