汉诺塔 (杭电acm2064)

xiaoxiao2021-02-28  121

Problem Description 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。 现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面。 Daisy已经做过原来的汉诺塔问题和汉诺塔II,但碰到这个问题时,她想了很久都不能解决,现在请你帮助她。现在有N个圆盘,她至少多少次移动才能把这些圆盘从最左边移到最右边?   Input 包含多组数据,每次输入一个N值(1<=N=35)。   Output 对于每组数据,输出移动最小的次数。   Sample Input 1 3 12 Sample Output 2 26 531440 分析: 设f(i)为i个圆盘 按顺序从左边移到右边所用的步数。 左边有i个圆环, 先将上面的i-1个圆环挪到右边,即f(i-1)(函数中已经包含了i-1个圆环先到中间在到右边的过程), 在将最后一个大圆盘挪到中间,即1步, 然后将右边的i-1个挪到左边, 再将中间的大圆盘挪到右边, 最后将左边的i-1个挪到右边,即

f(i) = 3 * f(i-1) + 2;

#include<iostream> __int64 f[21]; int main() { int sum; //圆盘数 f[0]=0; f[1]=2; for(int i =2;i<21;i++) f[i] = 3*f[i-1]+2; while(scanf("%d",&sum)!=EOF) { scanf("%d",&sum); printf("%I64d\n",f[sum]); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-29266.html

最新回复(0)