用1,2,...,n表示n個(gè)盤子蔚袍,稱為1號(hào)盤坷襟,2號(hào)盤,...奸柬。號(hào)數(shù)大盤子就大。經(jīng)典的漢諾塔問
題經(jīng)常作為一個(gè)遞歸的經(jīng)典例題存在啤握∧衤疲可能有人并不知道漢諾塔問題的典故晶框。漢諾塔來源于
印度傳說的一個(gè)故事排抬,上帝創(chuàng)造世界時(shí)作了三根金剛石柱子懂从,在一根柱子上從下往上按大小
順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱
子上蹲蒲。并且規(guī)定番甩,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動(dòng)一個(gè)圓盤届搁。我們
知道最少需要移動(dòng)2^64-1次.在移動(dòng)過程中發(fā)現(xiàn)缘薛,有的圓盤移動(dòng)次數(shù)多,有的少 卡睦。 告之盤
子總數(shù)和盤號(hào)宴胧,計(jì)算該盤子的移動(dòng)次數(shù).
Input
包含多組數(shù)據(jù),首先輸入T,表示有T組數(shù)據(jù).每個(gè)數(shù)據(jù)一行表锻,是盤子的數(shù)目N(1<=N<=60)和盤
號(hào)k(1<=k<=N)恕齐。
Output
對于每組數(shù)據(jù),輸出一個(gè)數(shù)瞬逊,到達(dá)目標(biāo)時(shí)k號(hào)盤需要的最少移動(dòng)數(shù)显歧。
Sample Input
2
60 1
3 1
Sample Output
576460752303423488
4
問題來源:https://vjudge.net/problem/HDU-1995
問題分析:每次都是先將其他圓盤移動(dòng)到輔助柱子上,并將最底下的圓盤移到c柱子上确镊,然后再把原先的柱子作為輔助柱子士骤,并重復(fù)此過程。
代碼分析:遞歸蕾域,下一個(gè)盤子移動(dòng)的次數(shù)是上一個(gè)盤子的兩倍拷肌。
AC通過的C++代碼:
#include<iostream>
using namespace std;
long long f(int n, int k)
{
if (n == k) return 1;
else return f(n, k + 1) * 2;
}
int main()
{
int t, n, k;
cin >> t;
while (t--)
{
cin >> n >> k;
cout << f(n, k) << endl;
}
return 0;
}