HDU2064 汉诺塔III 递推做法

HDU2064 汉诺塔III

很郁闷,以前会做的汉诺塔问题居然一开始没想出来,好记性不如烂笔头,今日把这道题目记下来,方便以后查阅
( ・◡・)
这道题目和经典汉诺塔问题还不太一样,原题链接在此:HDU2064 不过题目再怎么变,思路还是一样的。
汉诺塔问题重点在于找到递推式,分析思路即模拟搬圆盘的过程,设step[i]为搬动第i个圆盘需要的最小步数。思路如下:

  • 首先将 i-1 个圆盘移动到最右边柱子上
  • 然后第 i 个圆盘移到中间
  • i-1 个圆盘再移动到最左边的柱子上
  • i 圆盘移动到最右边柱子上
  • 最后将i-1个圆盘移动到最右边的柱子上

由上述过程可得递推式:
step[i]=step[i-1]+1+step[i-1]+1+step[i-1]=3step[i-1]+2


实现代码

#include<cstdio>
using namespace std;
int main(){
    int n,i;
    long long step[35];
    step[0]=2;
    for(i=1;i<35;i++){
        step[i]=3*step[i-1]+2;
    }
    while(scanf("%d",&n)!=EOF){
        printf("%lld\n",step[n-1]);
    }
    return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值