zoukankan      html  css  js  c++  java
  • HDU 2077

    Problem Description
    还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。
     
    Input
    输入数据的第一行是一个数据T,表示有T组数据。
    每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
     
    Output
    对于每组输入数据,最少需要的摆放次数。
     
    Sample Input
    2 1 10
     
    Sample Output
    2 19684
     
    该题是汉诺塔III 的改版,该题的模拟步骤如下:
    (1) n-2 个盘子从A移动到C   2步
    (2) 第n-1个盘子从A移动到B 1步
    (3) 第n个盘子从A移动到B    1步
    (4) n-2个盘子从C移动到A    2步
    (5) 第n个盘子从B移动到C    1步
    (6) 第n-1个盘子从B移动到C 1步
    (7) n-2个盘子从A移动到C    2步
     
    1,4,7步就是模拟汉诺塔III的走法,其最小步数为g(n)=3^n-1
    然后有三次,g(n)*3
    2,3,5,6 是固定步数总共为4,
    所以该方程为Hanoi[n] = 3*g(n)+4;
     
    代码如下:
    #include<stdio.h>
    #include<math.h>
    
    int main()
    {
        long long int Hanoi[25];
        int i,n,t;
        Hanoi[2] = 4;
        Hanoi[1] = 2;
        for(i = 3;i <= 20;i ++)
        {
            Hanoi[i] = 3*(pow(3,i-2)-1) + 4;
        }
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            printf("%I64d
    ",Hanoi[n]);
        }
        return 0;
    }
    Hanoi
  • 相关阅读:
    HashMap和Hashtable及HashSet的区别
    Android获取系统的时间
    Android的布局属性
    ListView 在代码里设置margin
    如何用Vue自己实现一个message提示插件
    JS获取最近三个月日期范围
    css实现表单label文字两端对齐
    my utils
    Vue 路由&组件懒加载(按需加载)
    C# 通过window消息控制指定控件的scroll滚动
  • 原文地址:https://www.cnblogs.com/52Cassie/p/4945612.html
Copyright © 2011-2022 走看看