由题意得:
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;
}