#include<iostream>
#define maxn 21
//最大的可以放在最上面,所以只要把前n-1个弄好,然后把最后一个丢上面就可以了
//所以f[n] = d[n-1]+2 d[n-1]是从最左边移动到最右边需要的步数
using namespace std;
int main()
{
int n;
long long dp[maxn],dd[maxn];
dp[0] = 0;
dp[1] = 2;
dd[1] = 2;
//先求出从最左边移动到最右边需要的步数。
for(int i=2;i<=20;i++)
{
dp[i] = dp[i-1]*3 + 2;
}
//只有第n个盘子可以特殊处理
//总的步数等于将n-1个移动到最右边,加上移动最大的盘子的两步。
for(int i=2;i<=20;i++)
dd[i] = dp[i-1]+2;
cin>>n;
while(n--)
{
int x;
cin>>x;
cout<<dd[x]<<endl;
}
return 0;
}
//参考博客https://blog.csdn.net/howardemily/article/details/52755264
/* https://blog.csdn.net/chang_mu/article/details/38129583 hanoi III
题目说我们可以将最大的一个放在上面!!
由汉诺塔III我们知道递推关系式为 F[n]=3*F[n-1]+2;
那么对于这一题我们可以将n-1个盘子像汉诺塔的III的规则一样,
先移动到B,再将最大的盘子移动到B,再到C,再将B上的移动到C;
得出递推关系式为f[n]=F[n-1]+2;:
假设将n层塔从A经B挪到C需要f[n]步。那么具体的移动过程可以这样看:将上面n-1层从A经B挪到C需要f[n-1]步,再将第n层从A挪到B,需要一步,再将上n-1层从C经B挪到A,需要f[n-1]步,再将第n层从B挪到C,需要一步,再将上n-1层从A经B挪到C,需要f[n-1]步,总计3*f[n-1] + 2步,其中 f[1] = 2;
*/
hanoi递推
猜你喜欢
转载自blog.csdn.net/qq_36734025/article/details/81171116
今日推荐
周排行