1. 程式人生 > >HDU 1995 漢諾塔V

HDU 1995 漢諾塔V

stream cstring 開始 scan return blog mat 容易 tput

用1,2,...,n表示n個盤子,稱為1號盤,2號盤,...。號數大盤子就大。經典的漢諾塔問
題經常作為一個遞歸的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於
印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小
順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱
子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動一個圓盤。我們
知道最少需要移動2^64-1次.在移動過程中發現,有的圓盤移動次數多,有的少 。 告之盤
子總數和盤號,計算該盤子的移動次數.

Input包含多組數據,首先輸入T,表示有T組數據.每個數據一行,是盤子的數目N(1<=N<=60)和盤

號k(1<=k<=N)。
Output對於每組數據,輸出一個數,到達目標時k號盤需要的最少移動數。
Sample Input

2
60 1
3 1

Sample Output

576460752303423488
4

拿n-1個盤的時候,其實就是這最底下那個盤的移動,若我們設f(n)是第n個盤的移動次數,那麼就很容易猜想到f(n-1) = 2f(n)所以f(k) = 2f(k+1)

f(n) = 1; 所以f(k) = 2^(n-k);

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4
#include<cmath> 5 using namespace std; 6 int main(){ 7 int t,n,k; 8 scanf("%d",&t); 9 while(t--){ 10 scanf("%d%d",&n,&k); 11 cout<<(long long)pow(2.0,n-k)<<endl; 12 } 13 return 0; 14 }

HDU 1995 漢諾塔V