汉诺塔问题

简单汉诺塔

在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由n个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。

  • 1个盘子:将盘子从最左边移动到最右边,只需1步,即a[1]=1
  • 2个盘子:将小盘子从最左边移动到中间,再将大盘子从最左边移动到最右边,最后将小盘子从中间移动到最右边,如下图1~3所示,共需3步,即a[2]=3
  • 3个盘子就可以寻找到规律了,如图所示,共需7步,即a[3]=7
  • 在这里插入图片描述

综上所述,在三根柱子,n个盘子的情况下
最少移动的步数为a[n] = 2 * a[n-1] + 1

变形一

同样是3根柱子,n个盘子,除了要求大盘子不能在小盘子上之外,还要求不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出)

  • 1个盘子:从a到b,再从b到c,共需两步,即a[1]=2
  • 2个盘子:共需8步,即a[2]=8
  • 在这里插入图片描述
  • 3个盘子按照同样的原理寻找规律,共需26步,即a[3]=26
  • 在这里插入图片描述

综上所述,当添加不能从最左边直接移到最右边的要求后
最小的移动步数为a[n] = 3 * a[n-1] + 2

变形二

在变形一的基础上,允许最大的盘子可以在小盘子上面
即:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),但是允许最大的盘子放到最上面(只允许最大的放在最上面)

  • 首先考虑最后的状态,n-1的盘子在中间
  • 在这里插入图片描述
  • 图片演示得很清楚,接下来要研究a[n]要如何得到
  • a[n]的定义是n个盘子移动到邻柱需要的步骤
  • 在这里插入图片描述

综上所述可以得到,要研究n个盘子如何到达最右边,就需要知道n-1个盘子到达邻柱所需的步骤,而其是由n-2个盘子到达邻柱所需步骤得出的,它们的关系为:
n个盘子移到最右边的步骤=2*a[n-1]+2
a[n-1] = 3 * a[n-2] + 1
首先得到a[]的表,再根据n直接输出即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值