1. 程式人生 > >漢諾塔系列:HDU 2064,2077

漢諾塔系列:HDU 2064,2077

漢諾塔Ⅲ

題目連結:

題目:

漢諾塔III

                                                 時間限制:1000/1000 MS(Java / Others)記憶體限制:32768/32768 K(Java / Others)
問題描述 約19世紀末,在歐州的商店中出售一種智力玩具,在一塊銅板上有三根杆,最左邊的杆上自上而下,由小到大順序串著由64個圓盤構成的塔目的。是將最左邊杆上的盤全部移到右邊的杆上,條件是一次只能移動一個盤,且不允許大盤放在小盤的上面。
現在我們改變遊戲的玩法,不允許直接從最左(右)移到最右(左)邊(每次移動一定是移到中間杆或從中間移出
),也不允許大盤放到下盤的上面

.Daisy已經做過原來的漢諾塔問題和漢諾塔II,但碰到這個問題時,她想了很久都不能解決,現在請你幫助她。現在有ñ個圓盤,她至少多少次移動才能把這些圓盤從最左邊移到最右邊 輸入 包含多組資料,每次輸入一個Ñ值(1 <= N = 35)。 產量 對於每組資料,輸出移動最小的次數。 示例輸入 1 3 12 示例輸出 2 26 531440

題目分析:

題目大意:

      將最左邊杆上n個自上而下,由小到大的盤移到最右邊杆上,要求:不允許直接從最左(右)邊移到最右(左)邊(每次移動一定是移到中間杆或從中間移出),也不允許大盤放到下盤的上面

思路:

我們令將n個盤從A-> B需要一個(n)步。

下面分三步進行:

將n-1個盤從A - > B - > C,需要一個(n-1)步
將第n個盤從A->B,再將n-1個盤從C ->B ->A,需要一個(n-1)+ 1步
將第n個盤從B -> C,再將n-1個盤從A -> B -> C,需要1 + a(n-1)步

所以a(n)= 3 * a(n-1)+ 2步。

注意資料範圍。

AC程式碼:

#include <stdio.h>
int main()
{
    int n,i;
    long long a[40]= {0,2};
    for (i=2; i<=35; i++)
        a[i]=3*a[i-1]+2;
    while(~scanf("%d",&n))
        printf("%lld\n",a[n]);
    return 0;
}

我看到有人說有通項公式f(n)= 3 ^ n - 1,結果試了一下提交發現WA了,於是對比了兩個資料

將不同的地方打印出來了:

a(21)= 10460353202                  f(21)= 10460353201 

a(25)= 847288609442                f(25)= 847288609441 

a(23)= 94143178826                  f(23)= 94143178825 

a(27)= 7625597484986              f(27)= 7625597484985
a( 29)= 68630377364882           f(29)= 68630377364881 

a(31)= 617673396283946          f(31)= 617673396283945 

a(33)= 5559060566555522        f(33)= 5559060566555521 

a(35)= 50031545098999706      f(35)= 50031545098999705




漢諾塔Ⅳ

題目連結:

題目:

漢諾塔IV

                                            時間限制:1000/1000 MS(Java / Others)記憶體限制:32768/32768 K(Java / Others)
問題描述 還記得漢諾塔III嗎他的規則是這樣的:不允許直接從最左(右)邊移到最右(左)邊(每次移動一定是移到中間杆或從中間移出),也不允許大盤放到小盤的上面.xhd在想如果我們允許最大的盤子放到最上面會怎麼樣呢?(只允許最大的放在最上面)當然最後需要的結果是盤子從小到大排在最右邊。 輸入 輸入資料的第一行是一個數據T,表示有組資料。
每組資料有一個正整數N(1 <= N <= 20),表示有個盤子。 產量 對於每組輸入資料,最少需要的擺放次數。 示例輸入 2 1 10 示例輸出 2 19684

題目分析:

題目大意:

漢諾塔Ⅲ相比,它多了一個條件:允許最大的盤子放到最上面(只允許最大的放在最上面),其餘條件不變。

思路:

先將上面n-1個盤子從A - > B,需要一個(n-1)步
再將第n個盤子從A→B→C,需要2步
最後將n-1個盤子從BC,需要一個第(n-1)步

所有相對於漢諾塔Ⅲ,A(n)= a(n-1)+2,在題目範圍內可以用通項公式f(n)= 3 ^ n - 1

AC程式碼:

(1)利用公式:A(n)= a(n-1)+2



#include <stdio.h>
int main()
{
    int n,m,i;
    long long a[25]= {0,2};
    for (i=2; i<=20; i++)
        a[i]=3*a[i-1]+2;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        printf("%lld\n",a[m-1]+2);
    }
}


(2)利用通項公式:f(n)= 3 ^ n - 1



#include <stdio.h>
#include <math.h>
int main()
{
    int n,m,i;
    long long a;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d",&n);
        a=pow(3,n-1)+1;
        printf("%lld\n",a);
    }
    return 0;
}

相關推薦

系列HDU 20642077

漢諾塔Ⅲ 題目連結: 題目: 漢諾塔III                                                  時間限制:1000/1000 MS(Java /

HDU 2064 III 和 HDU 2077 IV

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

系列問題 II、III、IV、V、VI、VII

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

系列問題 II、III、IV、V、VI

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

問題原始碼詳解一種比較形象的輸出顯示結果

// Hanoi.cpp : Defines the entry point for the console application. // #include <stdafx.h> #include "stdio.h" #include "iostream.h

HDU 2064 III 題解

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

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 2064:III

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

學習筆記有不正確的地方請小夥伴們指正~·~

學習 順序執行 == cab -1 nbsp 什麽 猜想 abc 1* n=3.abc; 2* n-1=2,acb; 3* n-1=1,abc 1* n=3,執行hanoi(n-1,A,C,B); =>2* n-1=2,acb執行hanoi

(河內)問題

漢諾塔 medium 問題 http int logs 一行 移動 else     漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小

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號盤,...。號數大盤子就大。經典的漢諾塔問 題經常作為一個遞歸的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於 印度

遞推遞歸組合數回文數問題(java)

char n-1 判斷 resource int swa one ise tex 遞推遞歸組合數: 1 思路:用函數求得n!,調用函數計算結果流程圖 2 .1流程圖 3 .1源代碼: import java.util.Scanner; public class

課後作業2遞歸編程解決問題

args 漢諾塔問題 char ext n) 兩個 port one input 【程序設計思想】 將A座上盤子移到C座上,實現的操作:1,將A座上除最下面其余盤子移到B座上2,將A座上一個盤子移到C座上3,將B座上盤子移到C座上。

課程作業03用遞歸方法計算組合數、解決問題、判斷某個字符串是否回文

java class ply math alt static multi 構造 strong 課後作業1:使用計算機計算組合數 (1)使用組合數公式利用n!來計算 程序設計思想: 設計並調用大數求階乘的方法結合組合數公式計算組合數的值。 程序流程圖: 程序源代碼

題解報告hdu1995V

pre clas gpo style bit body turn 規律 class 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 解題思路:求第k號盤子至少需要移動的次數,實際上是求n-k(認作是前g-1個盤子移動的

題解報告hdu1996VI

http blog clu AC 鏈接 using 選擇 acm c++ 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1996 解題思路:每個盤子有3種選擇,故系列總數為3^n。(水題!!!) AC代碼: 1 #incl