• HDU 2077 汉诺塔IV


    汉诺塔IV

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 2735    Accepted Submission(s): 2085


    Problem Description
    还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。
     
    Input
    输入数据的第一行是一个数据T,表示有T组数据。
    每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
     
    Output
    对于每组输入数据,最少需要的摆放次数。
     
    Sample Input
    2 1 10
     
    Sample Output
    2 19684
     
    Author
    xhd
     
    Source
     
    Recommend
    lcy
     

     解题思路:

    如果有n个盘子,则需要前n-1个挪到中间的盘子上,然后最大的盘子挪到最右面,需要两步,把前(n-1)个盘子从左边挪到中间是和从中间挪到右边需要相同的次数。而a数组中存放的就是那个前n-1个盘子挪动到相同位置需要的次数。结果即为a[i-1]*2+2。
    而求a数组需要用到递推。公式为第i个为前n-1个移动次数的三倍加一,简化到两个盘子,小的先移动两次到最右边,大的移到中间,然后小的在移回中间,小的移动了三次,而大的移动了一次,就使他们全部挪动了一个位置
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    int a[22]={0,1};
    
    void Init(){
        for(int i=2;i<=20;i++)
            a[i]=3*a[i-1]+1;
    }
    
    int main(){
    
        //freopen("input.txt","r",stdin);
    
        int t,n;
        scanf("%d",&t);
        Init();
        while(t--){
            scanf("%d",&n);
            printf("%d
    ",2*a[n-1]+2);
        }
        return 0;
    }
  • 相关阅读:
    LC 综合 中级算法笔记
    LC 212. 单词搜索2
    [NLP] 2.2 文本正规化 (Text Normalization)
    本地秘钥复制到github,实现两者之间的交互
    Python 实例化对象
    C# 左补齐+ 生成一个星期的日期
    hello world
    迭代器模式、观察者模式
    代理模式、桥接模式、装饰器模式、适配器模式
    外观模式、组合模式、享元模式
  • 原文地址:https://www.cnblogs.com/jackge/p/3218733.html
Copyright © 2020-2023  润新知