汉诺塔2(四个柱)

Problem Description

经典的汉诺塔问题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。恩,当然这个传说并不可信,如今汉诺塔更多的是作为一个玩具存在。Gardon就收到了一个汉诺塔玩具作为生日礼物。   Gardon是个怕麻烦的人(恩,就是爱偷懒的人),很显然将64个圆盘逐一搬动直到所有的盘子都到达第三个柱子上很困难,所以Gardon决定作个小弊,他又找来了一根一模一样的柱子,通过这个柱子来更快的把所有的盘子移到第三个柱子上。下面的问题就是:当Gardon在一次游戏中使用了N个盘子时,他需要多少次移动才能把他们都移到第三个柱子上?很显然,在没有第四个柱子时,问题的解是2^N-1,但现在有了这个柱子的帮助,又该是多少呢?

Input

包含多组数据,每个数据一行,是盘子的数目N(1<=N<=64)。

Output

对于每组数据,输出一个数,到达目标需要的最少的移动数。

Sample Input

1 3 12

Sample Output

1 5 81

Author

Gardon

Source

Gardon-DYGG Contest 2

//动态规划,转移是g[n]=min{g[n-k]+g[n-k]+f[k]}(1<=k<n)其中f[n]是三个柱子时候的汉诺塔
//f[n]=f[n-1]+f[n-1]+1;----->f[n]=2^n-1;
#include<stdio.h>
#include<math.h>
int main()
{
    int n,i,k;
    double f[66],g[66];
    f[1]=2.0;
    for(i=2;i<=64;i++)f[i]=f[i-1]*2.0;
    for(i=1;i<=64;i++)f[i]-=1.0;
    g[1]=1;
    for(i=2;i<=64;i++)
    {
        g[i]=g[i-1]*2+f[1];
        for(k=2;k<i;k++)
        {
            double tmp=g[i-k]*2+f[k];
            if(g[i]>tmp)g[i]=tmp;
        }
    }
    while(scanf("%d",&n)!=EOF)
    {
        printf("%.0lf\n",g[n]);
    }
    return 0;
}

  

时间: 2024-10-10 18:12:57

汉诺塔2(四个柱)的相关文章

汉诺塔(四)(暴力)

汉诺塔(四) 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 汉诺塔问题是一个经典的问题,现在我们有 n 个柱子和 m 个编号(1-m)的球,我们现在要求把尽量多的球放在尽量少的柱子上,如果相邻两个球的和不是完全平方数的话球会相互排斥而无法接触.(注意:球必须从小到大放,每次只能放在其他球的上面或者一个新的柱子上面) 输入 首先一个T,表示T组测试数据,然后一个n(1<=n<=50). 输出 输出一行,表示n个柱子能放的最大的球编号. 样例输入 1 4 样例输出

nyoj 1078 汉诺塔(四)[二分图 || 规律 || 暴力 || 贪心]

题目:nyoj 1078 汉诺塔(四) 分析:做这个题目的时候是在图论的题目里面看到的,到时读了题目推了一下,发现好像有点规律,试了一下果然过了. 后来看了一下数据,才50,那么试了一下模拟,也过了. 好像zoj有一道题目卡模拟,模拟的时候必须贪心一下才能过 这道题出题人的意图在于考大家的:二分图最小路径覆盖. 把每一个球看做一个点,然后如果两个和为平方数的话就给这两个点之间连接一条边,然后用一个特殊的匹配算法,类似于匈牙利算法,但是每次找匹配的时候加入一条边上连接的有匹配的话就不能匹配,最后求

hd 1207(四汉诺塔)

三个汉诺塔算法 f(n)=2^n-1 两个思路大同小异 Frame算法 在1941年,一位名叫J. S. Frame的人在<美国数学月刊>上提出了一种解决四柱汉诺塔问题的算法,这是人们熟知的Frame算法: (1)用4柱汉诺塔算法把A柱上部分的n- r个碟子通过C柱和D柱移到B柱上[F( n- r )步]. (2)用3柱汉诺塔经典算法把A柱上剩余的r个碟子通过C柱移到D柱上[2^r-1步]. (3)用4柱汉诺塔算法把B柱上的n-r个碟子通过A柱和C柱移到D柱上[F(n-r)步]. (4)依据上

多柱汉诺塔最优算法

转自Florian 1. 三柱汉诺塔三柱汉诺塔是经典的汉诺塔问题,在算法设计中是递归算法的典型问题.其算法是这样的: 首先把A 柱上面的n- 1 个碟子通过C 柱移到B 柱上[T(n-1)步],然后把A 柱剩下的一个碟子移到C 柱上[1步], 最后把B 柱上所有的碟子通过A 柱移到C 柱上[T(n-1)步].很容易得到算法的递归方程为:T(n)=2*T(n-1)+1,因此,不难算出步数是T(n)=2^n-1.对于三柱汉诺塔的算法的正确性自然是毫无争议的,我们需要的是从三柱汉诺塔的设计中引申出多柱

汉诺塔题目总结

参考了别人的代码的总结 1.四柱汉诺塔问题和n柱汉诺塔问题 题目: #include<cstdio> #include<algorithm> #include<cmath> using namespace std; double f[70]; void init() { f[1] = 1; f[2] = 3; for(int i = 3; i <= 65; i++) { double Max = f[i - 2] * 2 + 3; for(int j = 1; j

Acdream 1219 The Towers of Hanoi Revisited(递归汉诺塔问题)

传送门 The Towers of Hanoi Revisited Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You all must know the puzzle named "The Towers of Hanoi". The puzz

关于递归和汉诺塔

汉诺塔这个问题很经典,不清楚题目的同学可以去百度一下,在这小子就不多说了,进入正题: 让我们打开表格,看看这座塔: 这塔看起来不咋地对不对?不过,我们的目标是把它原封不动的搬到c列上,可以借助b列.让我们从最简单的做起:假设只有两层,从下往上分别是1,2,这时候你会说这题目简直就是在侮辱你的智商!只需要三步: First.将2从a列移到b列: Second.将1从a列移到c列: Finally.将2从b列移到c列: 很简单对不对?那现在,让我们做做完整版:64层!不要紧张,先试试将1之上的所有积

4柱汉诺塔(zz)

多柱汉诺塔可以用Frame–Stewart算法来解决. The Frame–Stewart algorithm, giving a presumably optimal solution for four (or even more) pegs, is described below: Let be the number of disks. Let be the number of pegs. Define to be the minimum number of moves required t

汉诺塔的问题:4个柱子,如果塔的个数变位a,b,c,d四个,现要将n个圆盘从a全部移到d,移动规则不变

四柱汉诺塔问题的求解程序.解题思路:如a,b,c,d四柱. 要把a柱第n个盘移到目标柱子(d柱),先把上层 分两为两部份,上半部份移到b柱,下半部分移到c柱,再把第n盘移到 目标柱子,然后,c柱盘子再移到目标柱子,再把b柱盘子移到目标柱子. 细节地方: 上半部份移到b柱时,它的中间变量柱子是有二选一的.而下半部分 移到c柱时,它的中间变量柱子只有一个(因为一个柱子已被上半部份 占了).b,c也移到目标柱子时同理.