1. 程式人生 > >漢諾塔V 1周賽B

漢諾塔V 1周賽B

用1,2,…,n表示n個盤子,稱為1號盤,2號盤,…。號數大盤子就大。經典的漢諾塔問

題經常作為一個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於

印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小

順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱

子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動一個圓盤。我們

知道最少需要移動2^64-1次.在移動過程中發現,有的圓盤移動次數多,有的少 。 告之盤

子總數和盤號,計算該盤子的移動次數.

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

號k(1<=k<=N)。

Output
對於每組資料,輸出一個數,到達目標時k號盤需要的最少移動數。

這道題的演算法看似很難,實則不然,題目說64片的圓盤時,最少需要移動2^64-1次,而題目又說經典的漢諾塔問題經常作為一個遞迴的經典例題存在,所以很容易聯想到從小到大的圓盤至少移動的次數時有關係的的,又2的0次方+2的1次方+……2的63次方等與2的64次方減一,所以很容易想到某盤子的移動次數為2的N減K次飯。

#include <iostream>
using namespace std;

int main()
{
	
	
		int a, b, c;
		long long int d;
		cin >> a;
		for (int i = 0; i < a; i++)
		{
			cin >> b >> c;
			d = 1;
			for (int j = 0; j < (b - c); j++)
				d = d * 2;
			cout << d << endl;
		}



	
  
}

新增連結描述