用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
思想
漢諾塔問題源于印度神話
那麼好多人會問64個圓盤移動到底會花多少時間?那麼古代印度距離現在已經很遠,這64個圓盤還沒移動完麼?我們來通過計算來看看要完成這個任務到底要多少時間?
我們首先利用數學上的數列知識來看看F(n=1)=1,F(n=2)=3,F(n=3)=7,F(n=4)=15……F(n)=2F(n-1)+1;
我們使用數學歸納法可以得出通項式:F(n)=2^n-1。當n為64時F(n=64)=18446744073709551615。
我們假設移動一次圓盤為一秒,那麼一年為31536000秒。那麼18446744073709551615/31536000約等于584942417355天,換算成年為5845.54億年。
目前太陽壽命約為50億年,太陽的完整壽命大約100億年。是以我們整個人類文明都等不到移動完整圓盤的那一天。
特别要注意大盤子不能放在小盤子的上面
///就像三個盤子一樣, 如果想要将第三個盤子移到C柱子隻需要一步, 但是前提是将上邊2個盤子通過C柱子移到B柱, 而這一過程中移動第二盤子時會在第三個盤子的基礎上移動次數多1倍, 同理, 第一個盤子也會比第二個盤子移動次數多1倍。是以當有n個盤時,第n-1個盤子的移動次數總是第n個盤移動次數多1倍,即cishu(n-1) = 2*cishu(n).
先用一個數組記錄60個盤子的每号盤子的移動次數,a[1]記錄的是最後放的盤子。
這樣求第k個盤子就是求a[n-k+1]
package rjmgc;
import java.math.BigInteger;
import java.util.Scanner;
public class H___ {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
BigInteger a[]=new BigInteger[65];
a[1]=new BigInteger("1");
for(int i=2;i<=60;i++){
a[i]=a[i-1].multiply(new BigInteger("2"));
}
while(T>0){
int N=sc.nextInt();
int k=sc.nextInt();
System.out.println(a[N-k+1]);
T--;
}
}
}