天天看點

漢諾塔系列-1

用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--;

        }

    }

}