hdu 2064 汉诺塔III


约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。
现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面。
Daisy已经做过原来的汉诺塔问题和汉诺塔II,但碰到这个问题时,她想了很久都不能解决,现在请你帮助她。现在有N个圆盘,她至少多少次移动才能把这些圆盘从最左边移到最右边?

Input
包含多组数据,每次输入一个N值(1<=N=35)。

Output
对于每组数据,输出移动最小的次数。

Sample Input
1
3
12

Sample Output
2
26
531440
关系式:F[N]=3*F[N-1]+2;
思路: 因为不能直接从最左面到最右面;所以我们每次都必须经过B柱子;
我们每次都将n-1个盘子移动到B再移动到C,需要F[N-1]次,再将第n个盘子移动到B需要一次;再将C上的n-1个盘子经过B移动到A 需要F[N-1]次(因为B上的盘子为最大的盘子所以不影响,移动N-1个盘子的时候可以看做没有,所以还为F[N-1]次),再将第n个盘子从B移动到C需要一次,再将A上的n-1个盘子经过B移动到C也需要F[N-1]次,由此得出递推关系式 F[N]=3*F[N-1]+2;
ac代码:
#include<stdio.h>
int main ()
{
int i,N;
__int64 f[36];
f[1]=2;
for(i=2;i<36;i++)
f[i]=3*f[i-1]+2;
while(scanf(“%d”,&N)!=EOF)
{
printf(“%I64d\n”,f[N]);//f(n)=3^N-1;
}
return 0;
}


    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/howardemily/article/details/52755396
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞