汉诺塔问题

汉诺塔问题,条件如下:

1、这里有 A、B、C 三座塔。

2、这里有 n 个圆盘,n 的数量是恒定的。

3、每个圆盘的尺寸都不相同。

4、所有的圆盘在开始时都堆叠在塔 A 上,且圆盘尺寸从塔顶到塔底逐渐增大。

5、我们需要将所有的圆盘都从塔 A 转移到塔 C上。

6、每次可以移动一个圆盘,当塔为空塔或者塔顶圆盘尺寸大于被移动圆盘时,可将圆盘移至这座塔上。

求出把A的盘子移到C上的步骤数。

 

思路:

1.将n - 1个盘子从a移到c中(以b为介质)

2.将a中最后一个盘子,也就是最大的一个盘子移到c上。

我们来推一下递推公式:移动n个盘子,在第一步移动了n - 1个盘子一次,移动了第n个盘子一次。在步骤二移动了n - 1个盘子一次。

所以递推公式为:d[i] = 2 * d[i - 1] + 1; d[i]表示移动i个盘子要操作的次数。

 

3.再将b中n - 1个盘子移到cwatermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDnnJ_nmoTkuI3nn6XpgZPlj6vku4DkuYjllYo,size_20,color_FFFFFF,t_70,g_se,x_16

 

思考:如果把柱子换成4根,那最少需要多少步呢。 

我们首先将a柱上的j根盘子放到d盘上,然后不管d盘了,之后把a,b,c看成3柱汉诺塔问题来处理。

分析一下递推公式:

首先将j个盘子放到d,要d[j]次,再将n - j个盘子放到c盘上,要d[n - j]次,之后再将d盘中的j个盘子移动到c盘上,要d[j]次。

那么j是多少呢?我们一一枚举就行了,找出最小值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值