Hanoi(汉诺塔)问题

问题 A

小A和小B在玩个游戏,规定谁输了就要请谁吃顿大餐:小A给小B a b c三个柱子, 并在a柱上放置了数量为n的圆盘,圆盘的大小从上到下依次增大,现在要做的事就是把a柱的圆盘全部移到c柱,移动的过程中保持小盘在上,大盘在下,且限定圆盘只能够移动到相邻的柱子,即a柱子上的圆盘只能够移动到b,b柱子上的圆盘只能够移动到a或者c,c同理。现在请你设计一个程序,计算所需移动的最小步数, 帮助小B赢得大餐!

0<=n<26

今天碰到这道题,一时把我给难住了。但感觉有很熟悉,所以经过一番搜索,我发现原来是叫汉诺塔问题,所以今天我来小小的总结一下:

【什么是汉诺塔问题?】

汉诺塔:相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

                                                                                                                       ---引用百度百科

刚看这道题我是一头雾水,不知所措。但无论是啥题目,我们首先是要建一个模型,更加方便直观,有助于我们解答。

首先我们思考一下:假设移动的步骤数为 w

n=1时,不难想到,w=2;

n=2时,先1号(最小)盘子移到B,再2号(较大)盘子移到C,最后1号移到C,w=3;

n=3时,简化着写:按顺序 1->C, 2-> B, 1->B , 3-> C,1->A,2->C,1->C, w=7;

以此类推 ,想必有人已经知道了,我们可以得出规律:w=2^n-1.

上面只是一个规律的总结,接下来我们用递归思想来做:

回想一下,我们刚刚推导的过程,我们不难发现,几乎每一个都是在重复以下过程:

先把n-1 个看成一个整体

                                                                    图一 

                                                                图二 

PS:从左到右依次时A,B,C

举个栗子:当n=3时   1->C, 2-> B, 1->B,3-> C, 就实现了图一 所示的全部步骤;

而1->A,2->C,1->C,,就实现了图二的步骤。

我们再来仔细地想想:首先,1号 移到了b 上 然后 2号赶紧 到了C 上 ,为了给三号腾位置,1号就移到C上,同时 3号 紧接着移到了B上,然后 1 和2 通过移动 到B 上。于是1 2 3 都在B上,再有为了让4号去到B,又是一顿折腾(让1 2 3 到 C  空出B) 以此往复 ,不断折腾。

思想大致就是这样了。

现在,回到问题A ,这道题的难度加大了,因为题目中加入了a柱子上的圆盘只能够移动到b,b柱子上的圆盘只能够移动到a或者c,c同理,这个限制条件,但是核心思想是不变的。我们按原来的思路想。先把 n -1 个盘子 通过某种方法移到C柱,然后第n 盘子 移到B ,再把n-1  个盘子移到A ,同理 第n 个盘子 移到C 最后把 n -1 个盘子 再移到 C即可。

按照此法,我们不难推出:

n=1 时 w=2

n=2 时 w=8

n=3时 w=26

.........

由此可得:w=3^n-1

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别抢我的辣条~

老板大气!祝老板身体健康!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值