起初一直没弄懂题目的意思 以为汉诺塔可以倒着放置 后来看了下别人的解题报告 实则只有最大的那块有特权
假设现在有n块盘 要将其从A盘通过B盘搬到C盘 只需将上面的(n-2)块盘先从A柱通过B柱搬到C柱 再将第n-1块盘搬到B柱上 又因为第n块最大有特权可以放在第(n-1)块上面
之后的思路就跟2064那题一样 就是将C柱子上的n-2块盘一并搬到A柱上 再将B柱上的倒着放的第n-1块和第n块搬到C竹子上
由此可见 上面的n-2块 一共搬动整体移动3次 下面的第n块和第n-1块只需搬动4次
ss[n]=3*as[n-2]+4;
as[i]保存的是n个没有特权的盘子移动的最优次数
汉诺塔IV
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4699 Accepted Submission(s): 3446
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
2 1 10
2 19684
#include<stdio.h>
#include "math.h"
int main(void)
{
int m,n;
long long int ss[100],as[100];
as[0]=0;
as[1]=2;
for(int i=2;i<=64;i++)
as[i]=3*as[i-1]+2;
ss[1]=2;
for(int i=2;i<=64;i++)
ss[i]=3*as[i-2]+4;
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
printf("%lld\n",ss[n]);
}
}