HDU 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;
}

猜你喜欢

转载自blog.csdn.net/aptx4869971/article/details/82957851