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

2077 漢諾塔IV 題解

由題意得:

1.此題相較於傳統的漢諾塔問題,多了一個新限制——從左(右)邊到最右(左)邊時,必須經過中間;少了一箇舊限制——允許最大的盤子放到最上面

2.問題就變成了三個步驟:(一)將(n-1)個盤子從最左邊移到中間,(二)然後加“2”,(三)最後再將這(n-1)個盤子從中間移到最右邊

3.由於最大的盤子能夠承載其餘任意盤子,相當於不存在,所以從前後兩面來看,(一)與(三)的步數是一樣的

4.當“n-1”的值為1、2、3時,(一)對應的步數為1、4、7,得推導公式為:3*(n-1)+1

5.當“n”的值為“1”時,只有步驟(二)

6.程式碼如下:

#include<iostream>
using namespace std;

long long hanoi(int n)
{
    long long f[22]={0};
    for(int i=1; i<=n; i++)
        f[i]=3*f[i-1]+1;
    return 2*f[n]+2;
}

int main()
{
    int t,n,i;
    cin>>t;
    while(t--)
    {
        cin>>n;
        cout<<hanoi(n-1)<<endl;
    }
    return 0;
}