题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2064
这个题目改变了汉诺塔的经典玩法,但其实一样画图找出递归公式就可以了
首先数组a[]记录移动的步数,a[1]=2,因为游戏规定不能直接从最左边移到最右边,只能从中间过,所以一个盘子的时候就多了一步
接下来 A B C三个塔,n(n>=2)个盘子,模拟整个过程:
1.先考虑n-1个盘子,将n-1个盘子通过B移到C塔,需要移动的步数是a[n-1]
2.再将第n个盘子从A移到B ,需要移动的步数是 1
3.然后再将n-1个盘子通过B从C移到A,因为B上存在的盘子比C上的盘子都要大,所以C上的盘子可以放置在B上,从C-->B-->A此步骤需要的步数是a[n-1]
4.再将第n个盘子从B移到C 需要的步数是 1
5.然后再将A上的n-1个盘子通过B移到C 此步骤需要的步数是a[n-1]
所以移动n个盘子需要的步数总和是 3*a[n-1]+2
#include <stdio.h>
int main(){
int n,i;
__int64 a[36];
a[1]=2;
for(i=2;i<=35;i++)
{
a[i]=3*a[i-1]+2;
}
while(scanf("%d",&n)!=EOF)
{
printf("%I64d\n",a[n]);
}
return 0;
}