• Problem 1036 四塔问题


    Accept: 590    Submit: 1506
    Time Limit: 1000 mSec    Memory Limit : 32768 KB

     Problem Description

    “汉诺塔”,是一个众所周知的古老游戏。现在我们把问题稍微改变一下:如果一共有4根柱子,而不是3根,那么至少需要移动盘子多少次,才能把所有的盘子从第1根柱子移动到第4根柱子上呢?

    为了编程方便,您只需要输出这个结果mod 10000的值。

     Input

    该题含有多组测试数据,每组一个正整数n。(0<n<=50000)

     Output

    一个正整数,表示把n个盘子从第1根柱子移动到第4根柱子需要的最少移动次数mod 10000的值。

     Sample Input

    15

     Sample Output

    129
     
     
    做法:找规律
    #include<iostream>  
    using namespace std;  
    int main()  
    {  
        int n;  
        while(cin>>n && n!=0)
        {  
            int f[50001]={0};  //不能用int f[n+1];
            int p = 1;  
            int q = p;  
            int k = 1;  
            for(int i = 1; i <= n; i++)
            {  
                f[i] = (f[i-1] + k) % 10000;  
                q--;  
                if(q==0)
               {  
                   p++;  
                   q = p;  
                   k *= 2;  
                   k %= 10000;
                }  
             }  
            cout<<f[n]<<endl;  
        }  
        return 0;  
    }  

    该题用递归也可以做,但仅限于数很小的情况下

    f[n] = min{2*f[j]+H[n-j]}

    2*f[j]表示从A移动j个盘子到B再从B移动到D的所需次数,H[n-j]则是三塔问题中将n-j个盘子从A移到D所需要的次数

    另一种方法就是通过前几个数,进行找规律,写出通项公式,一层一层往上求解

    f[n] = f[n-1] + 2^k

    (k=0时,进行1次,k=1时进行2次)

  • 相关阅读:
    asp.net应用程序的生命周期和iis
    跨网页公布技术
    Java面试题:异常、静态变量
    js省市级联
    python基础之介绍
    Java学习(二)有关Tomcat的进一步理解与运用
    Java学习(一)环境的配置和软件的使用
    构造方法
    自言自语
    小小叹
  • 原文地址:https://www.cnblogs.com/wshyj/p/6489113.html
Copyright © 2020-2023  润新知