1. 程式人生 > >HDU 2077 漢諾塔IV

HDU 2077 漢諾塔IV

漢諾塔IV

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


Problem Description 還記得漢諾塔III嗎?他的規則是這樣的:不允許直接從最左(右)邊移到最右(左)邊(每次移動一定是移到中間杆或從中間移出),也不允許大盤放到小盤的上面。xhd在想如果我們允許最大的盤子放到最上面會怎麼樣呢?(只允許最大的放在最上面)當然最後需要的結果是盤子從小到大排在最右邊。

Input 輸入資料的第一行是一個數據T,表示有T組資料。
每組資料有一個正整數n(1 <= n <= 20),表示有n個盤子。

Output 對於每組輸入資料,最少需要的擺放次數。

Sample Input 2 1 10
Sample Output 2 19684
Author xhd
Source

注意:

1:找出規律即可

把(n-1)個盤子從左邊移到中間的移動最優規律:

把(n-2)個盤子 從左邊移到中間 需要 f(n-1)次

把(n-2)個盤子 從中間移到右邊 需要 f(n-1)次

把第(n-1)個盤子 從左邊移到中間 需要1次

把(n-2)個盤子 從右邊移到中間 需要 f(n-1)次

一共需要f(n)=3*f(n-1)+1次

此時相當於把(n-1)個盤子移到中間

然後:

把第n個盤子 從左邊移到右邊 需要移動2次

把(n-1)個盤子從中間移到右邊又需要f(n)=3*f(n-1)+1次

所以:

一共需要移動:ff(n)=2*f(n)+2次,其中f(n)=3*f(n-1)+1

#include<stdio.h>
int main (void)
{
    __int64 f[40],ff[40];

    ff[1]=2;
    ff[2]=4;
    f[3]=4;
    int i,n,m;
    for(i=4;i<=38;i++)
    {
        f[i]=3*f[i-1]+1;
    }
    for(i=3;i<=35;i++)
    {
        ff[i]=2*f[i]+2;
    }
    scanf("%d",&m);

    while(m--)
    {
        scanf("%d",&n);
        printf("%I64d\n",ff[n]);
    }
    return 0;
}

相關推薦

HDU 2077 IV

漢諾塔IV Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm

HDU 2077 IV 題解

由題意得: 1.此題相較於傳統的漢諾塔問題,多了一個新限制——從左(右)邊到最右(左)邊時,必須經過中間;少了一箇舊限制——允許最大的盤子放到最上面 2.問題就變成了三個步驟:(一)將(n-1)個盤子從最左邊移到中間,(二)然後加“2”,(三)最後再將這(n-1)個盤子從中間移到最右邊

HDU 2064 III 和 HDU 2077 IV

題目: Description 約19世紀末,在歐州的商店中出售一種智力玩具,在一塊銅板上有三根杆,最左邊的杆上自上而下、由小到大順序串著由64個圓盤構成的塔。目的是將最左邊杆上的盤全部移到右

HDU 2077 IV

漢諾塔IV Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4929    Accepted Submissio

HDU 2077IV

問題描述 還記得漢諾塔III嗎?他的規則是這樣的:不允許直接從最左(右)邊移到最右(左)邊(每次移動一定是移到中間杆或從中間移出),也不允許大盤放到小盤的上面。xhd在想如果我們允許最大的盤子放到最上面會怎麼樣呢?(只允許最大的放在最上面)當然最後需要的結果是

HDU 2077 IV【遞推】

Problem Description 還記得漢諾塔III嗎?他的規則是這樣的:不允許直接從最左(右)邊移到最右(左)邊(每次移動一定是移到中間杆或從中間移出),也不允許大盤放到小盤的上面。xhd在想如果我們允許最大的盤子放到最上面會怎麼樣呢?(只允許最大的放在最上面)

2077 IV 題解

由題意得: 1.此題相較於傳統的漢諾塔問題,多了一個新限制——從左(右)邊到最右(左)邊時,必須經過中間;少了一箇舊限制——允許最大的盤子放到最上面 2.問題就變成了三個步驟:(一)將(n-1)個盤子從最左邊移到中間,(二)然後加“2”,(三)最後再將這(n-1)個盤

Hdu 1207 II

scanf 是個 故事 font cep 麻煩 快的 nbsp str 漢諾塔II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis

HDU 1207 II (遞推)

return main 世界 個數 也會 來源 esp 一次 移動 經典的漢諾塔問題經常作為一個遞歸的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。上帝命令

HDU 1995 V

stream cstring 開始 scan return blog mat 容易 tput 用1,2,...,n表示n個盤子,稱為1號盤,2號盤,...。號數大盤子就大。經典的漢諾塔問 題經常作為一個遞歸的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於 印度

HDU ACM1995——V

漢諾塔V Problem Description 用1,2,…,n表示n個盤子,稱為1號盤,2號盤,…。號數大盤子就大。經典的漢諾塔問 題經常作為一個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於 印度傳說的一個故事,上帝創造世界時作了三根金

HDU ACM1996——VI

漢諾塔VI Problem Description n個盤子的漢諾塔問題的最少移動次數是2n-1,即在移動過程中會產生2n個系列。由於 發生錯移產生的系列就增加了,這種錯誤是放錯了柱子,並不會把大盤放到小盤上,即各柱 子從下往上的大小仍保持如下關係 : n=m+

HDU 2064 III 題解

由題意得: 1.與傳統的漢諾塔相比   多了一個限制——每次只能移動的相鄰的杆上 2.當“n”為“2”時,次數為“8”  從前三項的次數 “2  8  26”中不難得出推導公式   F[n]=3*F[n-1]+2

III 和 IV

#include <iostream> #include <stdio.h> #include <cmath> using namespace std; long long  hannuo (int n) {     long long num;     if (n ==

系列問題: II、III、IVV、VI、VII

 漢諾塔II:(hdu1207) /先說漢若塔I(經典漢若塔問題),有三塔,A塔從小到大從上至下放有N個盤子,現在要搬到目標C上, 規則小的必需放在大的上面,每次搬一個,求最小步數。這個問題簡單,DP:a[n]=a[n-1]+1+a[n-1],先把上面的n-1個放在B上,把

HDU 2064 III (遞迴)

//題意自己看,不懂度娘#include <stdio.h> #include <algorithm> #include <math.h> #include <

hdu 2064 III (水題)

漢諾塔III Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su

HDU 1207 II --遞推

題意:Gardon是個怕麻煩的人(恩,就是愛偷懶的人),很顯然將64個圓盤逐一搬動直到所有的盤子都到達第三個柱子上很困難,所以Gardon決定作個小弊,他又找來了一根一模一樣的柱子,通過這個柱子來更快

系列問題: II、III、IVV、VI

漢諾塔 漢諾塔II hdu1207: 先說漢若塔I(經典漢若塔問題),有三塔,A塔從小到大從上至下放有N個盤子,現在要搬到目標C上, 規則小的必需放在大的上面,每次搬一個,求最小步數。這個問題簡單,D

HDU2077:IV

Problem Description 還記得漢諾塔III嗎?他的規則是這樣的:不允許直接從最左(右)邊移到最右(左)邊(每次移動一定是移到中間杆或從中間移出),也不允許大盤放到小盤的上面。xhd在想如果我們允許最大的盤子放到最上面會怎麼樣呢?(只允許最大的放在最上面)當然