zoukankan      html  css  js  c++  java
  • HDU 1995 汉诺塔V

    汉诺塔V

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 1832    Accepted Submission(s): 1095


    Problem Description
    用1,2,...,n表示n个盘子,称为1号盘,2号盘,...。号数大盘子就大。经典的汉诺塔问
    题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于
    印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小
    顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱
    子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。我们
    知道最少需要移动2^64-1次.在移动过程中发现,有的圆盘移动次数多,有的少 。 告之盘
    子总数和盘号,计算该盘子的移动次数.
     
    Input
    包含多组数据,首先输入T,表示有T组数据.每个数据一行,是盘子的数目N(1<=N<=60)和盘
    号k(1<=k<=N)。
     
    Output
    对于每组数据,输出一个数,到达目标时k号盘需要的最少移动数。
     
    Sample Input
    2 60 1 3 1
     
    Sample Output
    576460752303423488 4
     
    Author
    Zhousc@ECJTU
     
    Source
     
    Recommend
    lcy
     

     當我們用遞歸做最經典版本的漢諾塔的時候,A、B、C三個柱子,n個盤,現將n-1個盤通過C柱移到B,再將第n個盤從A移到C,最後將n-1個盤通過A把n-1個盤移到C。

    而拿n-1個盤的時候,其實就是這最底下那個盤的移動,若我們設f(n)是第n個盤的移動次數,那麼就很容易猜想到f(n-1) = 2f(n)
    所以f(k) = 2f(k+1)
     
    f(n) = 1;
    所以f(k) = 2^(n-k);
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    
    using namespace std;
    
    int main(){
    
        //freopen("input.txt","r",stdin);
    
        int t,n,k;
        scanf("%d",&t);
        while(t--){
            scanf("%d%d",&n,&k);
            cout<<(long long)pow(2.0,n-k)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    fn project 试用之后的几个问题的解答
    fn project 扩展
    fn project 生产环境使用
    fn project 对象模型
    fn project AWS Lambda 格式 functions
    fn project 打包Function
    fn project Function files 说明
    fn project hot functions 说明
    fn project k8s 集成
    fn project 私有镜像发布
  • 原文地址:https://www.cnblogs.com/jackge/p/3218102.html
Copyright © 2011-2022 走看看