HDU 2077汉诺塔变形(2)
问题描述:在HDU 2064的基础上增加一条规则:最大的盘子可以放在其他盘子上,不可以从左移动到右或从右移动到左
因为最大的盘子的移动规则和其他盘子不一样,所以要单独处理它:
1)前n-1个盘子A->B
2)第n个盘子A->B->C
3)前n-1个盘子B->C
ans[n]=F[n-1]*2+2; //F[n]为n个盘子移动到相邻柱的操作数
接下来规则就对所有盘子适用了,可以递推求解,首先要求上一步中出现的F[n],即相邻柱移动的操作数
1)前n-1个盘子A->C;
2)第n个盘子A->B;
3)前n-1个盘子C->B;
F[n]=f[n-1]+1+F[n-1]; //f[n]为n个盘子A->C的操作数,与F[n]不同
最后求出f[n]即可,这个和HUD 2064汉诺塔变形(1)问题相同:
f[n]=f[n-1]*3+2;
逐层求出即可得到答案:
#include<stdio.h> int main() { long long F[20],f[20],ans[21]; int t,n,i; for(i=2,f[1]=2;i<20;i++) f[i]=f[i-1]*3+2; for(i=2,F[1]=1;i<20;i++) F[i]=F[i-1]+f[i-1]+1; for(i=2,ans[1]=2;i<21;i++) ans[i]=2*F[i-1]+2; scanf("%d",&t); while(t--) { scanf("%d",&n); printf("%d\n",ans[n]); } return 0; }