Hanoi汉诺塔心得。举例:(HDU2077汉诺塔IV)

本文介绍了汉诺塔问题的心得,特别是针对HDU2077汉诺塔IV的解题思路。作者指出常规汉诺塔模式的递推公式,并分析了特殊规则下新的递推关系,即f(n)=3*f(n-1)+1。通过理解题目中“一下”的含义,可以正确求解f(n)。文章提供了相应的C语言代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

怎么说呢。。前几天刚想刷下Hanoi的题目。但发现最近在上数据结构刚好举到Hanoi的例子,这是缘分吗。。

。。。好吧。在这里我也想讲下刷Hanoi题目的心得。就是。。。。(找规律)。其实不妨大胆猜想一下,生活中很多东西都是有规律的,扯远了。。。

最基本的Hanoi模式就不多讲了。大家应该都知道是f(n)=2*f(n-1)+1;在这里举个我觉得比较灵性变形题目

HDU2077汉诺塔IV,题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=2077

题目是:还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。

其实在这里可能大家一眼看出是 f(n)=2*f(n-1)+2;因为上面看成是(n-1)个只需要移动一下到中间,然后第n个移动一下放在上面,接着,再移动一下到最右边,(n-1)个整体再移动一下到第n个的上面就能得到f(n)=2*f(n-1)+2;

好了,做到这里我想说的是恭喜你找到规律了,但是结果却是错的。为什么?因为题目说了只有第n个也就是最大那个拥有特权!!

之前的(n-1)移动到中间可不只是需要一下。我们不难发现,上面的(n-1)移动到中间需要的是g(n)=3*g(n-1)+1;

知道这个以后,这个题目就解出来了。。为什么要举这个栗子?

其实我一开始,也是 f(n)=2*f(n-1)+2,然后发现是错的。。。其实,我想让大家要明白何为“一下”,也是就f(n-1),这样f(n)就不难求出。额,代码我还是贴出来吧。。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


int main()
{
    int t,n;
    long long a[21]={0,1};
    for(n=2;n<21;n++){
        a[n]=3*a[n-1]+1;
    }
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        printf("%d\n",2*a[n-1]+2);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值