1. 程式人生 > >HDU 2077漢諾塔IV

HDU 2077漢諾塔IV

問題描述
還記得漢諾塔III嗎?他的規則是這樣的:不允許直接從最左(右)邊移到最右(左)邊(每次移動一定是移到中間杆或從中間移出),也不允許大盤放到小盤的上面。xhd在想如果我們允許最大的盤子放到最上面會怎麼樣呢?(只允許最大的放在最上面)當然最後需要的結果是盤子從小到大排在最右邊。
輸入
輸入資料的第一行是一個數據T,表示有T組資料。
每組資料有一個正整數n(1 <= n <= 20),表示有n個盤子。
輸出
對於每組輸入資料,最少需要的擺放次數。
樣例輸入
2
1
10
樣例輸出
2
19684
解題思路
假設有n個盤子需要移動,那麼我們只需要把前n-1個盤子從左邊移至中間,再把第n個盤子移至右邊,最後把前n-1個盤子移動至右邊即可,因為把n-1個盤子自左邊移至中間與自中間移至右邊所需步數是一樣的,因此我們設一陣列a儲存前n-1個盤子移至中間所需步數,那麼總步數則為a[n-1]*2+2。
我們知曉若把0個盤子和1個盤子移至中間所需步數分別為0步和1步,當我們需要把n個盤子移動至中間時我們只需要把前n-1個盤子從左邊移至右邊,再把第n個盤子移至中間,再把n-1個盤子移至中間即可,因為將n-1個盤子由左邊移至中間,由中間移至右邊,由右邊移至中間所需步數一樣,則a[n]=a[n-1]*3+1。
程式碼

#include<stdio.h>
int main()
{
    int a[21],i,n,t;
    a[0]=0;a[1]=1;
    for (i=2;i<21;i++)
        a[i]=a[i-1]*3+1;
    scanf("%d",&t);
    for (i=0;i<t;i++)
    {
        scanf("%d",&n);
        printf("%d\n",2*a[n-1]+2);
    }
    return 0;
}

測試結果
這裡寫圖片描述