1. 程式人生 > >HDU 2077 漢諾塔IV【遞推】

HDU 2077 漢諾塔IV【遞推】

Problem Description 還記得漢諾塔III嗎?他的規則是這樣的:不允許直接從最左(右)邊移到最右(左)邊(每次移動一定是移到中間杆或從中間移出),也不允許大盤放到小盤的上面。xhd在想如果我們允許最大的盤子放到最上面會怎麼樣呢?(只允許最大的放在最上面)當然最後需要的結果是盤子從小到大排在最右邊。

Input 輸入資料的第一行是一個數據T,表示有T組資料。
每組資料有一個正整數n(1 <= n <= 20),表示有n個盤子。

Output 對於每組輸入資料,最少需要的擺放次數。

Sample Input 2 1 10
Sample Output 2 19684
/*
a[i]表示將i個從最左移到最右且只能小在上大在下的最少步驟數
b[i]表示將i個從最左移到最右且允許最大放在最上面的最少步驟數
c[i]表示將i個從最左移到中間且只能小在上大在下的最少步驟數
顯然c[i]也可以表示將i個從最右移到中間且只能小在上大在下的最少步驟數
a[i]的實現過程:
       由漢諾塔III可知:a[i]=3*a[i-1]+2;
b[i]的實現過程:①將i-1個從最左移到中間且只能小在上大在下,即c[i-1]
               ②將最左最底下第i個移到中間i-1個的最上面
			   ③將中間最上的第i個移到最右
			   ④將中間i-1個移到最右且只能小在上大在下,即c[i-1].
		合計:b[i]=2*c[i-1]+2;
c[i]的實現過程:①將i-1個從最左移到最右且只能小在上大在下,即a[i-1];
                ②將最左最底下的第i個移到中間
				③將最右的i-1個移到中間且只能小在上大在下,即c[i-1].
		合計:c[i]=a[i-1]+c[i-1]+1;
初始化:a[1]=2;b[1]=2;c[1]=1.
*/
#include <stdio.h>
#define maxn 21
int main()
{
	long long a[maxn] = { 0,2 }, b[maxn] = { 0,2 }, c[maxn] = { 0,1 };
	for (int i = 2;i < maxn;i++) {
		a[i] = 3 * a[i - 1] + 2;
		c[i] = a[i - 1] + c[i - 1] + 1;
		b[i] = 2 * c[i - 1] + 2;
	}
	int n, t;
	scanf("%d", &t);
	while (t--) {
		scanf("%d", &n);
		printf("%I64d\n", b[n]);
	}
	return 0;
}