漢諾塔系列: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)= 94143178825a(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 2064,2077
漢諾塔Ⅲ 題目連結: 題目: 漢諾塔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
SDUTACM遞迴之漢諾塔系列2(基於C語言)
漢諾塔系列2 Tim
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!來計算 程序設計思想: 設計並調用大數求階乘的方法結合組合數公式計算組合數的值。 程序流程圖: 程序源代碼
題解報告:hdu1995漢諾塔V
pre clas gpo style bit body turn 規律 class 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 解題思路:求第k號盤子至少需要移動的次數,實際上是求n-k(認作是前g-1個盤子移動的
題解報告:hdu1996漢諾塔VI
http blog clu AC 鏈接 using 選擇 acm c++ 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1996 解題思路:每個盤子有3種選擇,故系列總數為3^n。(水題!!!) AC代碼: 1 #incl