zoukankan      html  css  js  c++  java
  • hdu2064 汉诺塔Ⅲ(递归)

    汉诺塔III

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


    Problem Description
    约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。
    现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面。
    Daisy已经做过原来的汉诺塔问题和汉诺塔II,但碰到这个问题时,她想了很久都不能解决,现在请你帮助她。现在有N个圆盘,她至少多少次移动才能把这些圆盘从最左边移到最右边?
     
    Input
    包含多组数据,每次输入一个N值(1<=N=35)。
     
    Output
    对于每组数据,输出移动最小的次数。
     
    Sample Input
    1
    3
    12
     
    Sample Output
    2
    26
    531440
     
    若移动k个圆盘从第一根柱子到第三根柱子需要Fun(k)次移动,那么,先移动K-1个圆盘道第三根柱子需要Fun(k-1)次移动,再将最大的圆盘移动到中间柱子需要1次移动,
    然后将k-1个圆盘移动回第一根柱子同样需要Fun(k-1)次移动,移动最大的盘子到第三根柱子需要1次移动,最后将k-1个圆盘也移动到第三根柱子需要Fun(k-1)次移动,
    这样递归公式就是Fun(k)=3*Fun(k-1)+2。而递归的出口是k=1时,F(1)=2

    #include<iostream>
    #include <stdio.h>
    using namespace std;
    long long fun(int n)//递归
    {
        if(n == 0)
            return 0;
        if(n == 1) 
            return 2;
        return 3*fun(n - 1) + 2;
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n) != EOF)
            printf("%lld
    ",fun(n));
        return 0;
    }
    
    
    
     
  • 相关阅读:
    c++ struct 使用
    c++数组、字符串操作
    c++ List、Vector、Stack、Queue使用
    十三、哈希表
    十二、234树
    十一、红黑树
    十、哈夫曼编码
    九、二叉树
    八、高级排序
    七、递归
  • 原文地址:https://www.cnblogs.com/-citywall123/p/9521911.html
Copyright © 2011-2022 走看看