**
航电oj:汉诺塔IV
**
#题目描述
*#在原版汉诺塔的规则上加两点 不能一次移动两格(1到3 或3到1 都不行 要借助2) 特例 最大的那个盘中可以可以放在小的上面
#第二点 就只是单单在最后大盘移动时有用 多余时候不要乱想 改以下原版汉诺塔的步骤 将n-1个小的移动到3----------(1->3) a[n-1]次 将大的从1到2
-------(1->2) 1次 将n-1个移动到1 ---------(3->1)a[n-1]次 将大的从2移到3 ------(2->3)1次 将n-1个从1移到3 -----(3->1)a[n-1]次 加起来 3[n] +2
#a[n] 数组存储了不同层数汉诺塔完成时的最少移动次数
#知识点
递归
#代码
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,t;
int data[25]= {0};
int ans[25] = {0};
void math()
{
for(int i=2;i<=20;i++)
{
data[i] = 3*data[i-1] + 2;///1到3 data[i-1] 1到2 1 3到1 data[i-1] 2到3 1 1到3 data[i-1]
ans[i] = data[i-1] +2;
}
return ;
}
int main()
{
scanf("%d",&t);
data[1] = 2;
ans[1] = 2;
math();
while(t--)
{
scanf("%d",&n);
printf("%d\n",ans[n]);///成数
}
return 0;
}
#总结
递归要与上一个状态相联系