漢諾塔V 1周賽B
阿新 • • 發佈:2018-12-15
用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; } }