(HDU
来源:互联网 发布:淘宝店铺怎么制作店招 编辑:程序博客网 时间:2024/05/17 09:28
(HDU - 2064)汉诺塔III
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18567 Accepted Submission(s): 8779
Problem Description
约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。
现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面。
Daisy已经做过原来的汉诺塔问题和汉诺塔II,但碰到这个问题时,她想了很久都不能解决,现在请你帮助她。现在有N个圆盘,她至少多少次移动才能把这些圆盘从最左边移到最右边?
Input
包含多组数据,每次输入一个N值(1<=N=35)。
Output
对于每组数据,输出移动最小的次数。
Sample Input
1
3
12
Sample Output
2
26
531440
思路:设柱子为a,b,c,因为每次移动必须移到中间杆或者从中间杆移走。所以如果有n个盘子,设至少需要f[n]步,则先需要将上面n-1个盘子通过b杆移到c杆,把最大的那个盘子移到b杆,再把那n-1个盘子通过b杆移到a杆,把b杆上那个最大的盘子移到c杆,最后再把那n-1个盘子通过b杆移到c杆。由此可得递推公式:
#include<cstdio>using namespace std;const int maxn=40;long long f[maxn];int main(){ f[1]=2; for(int i=2;i<=35;i++) f[i]=3*f[i-1]+2; int n; while(scanf("%d",&n)!=EOF) { printf("%lld\n",f[n]); } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- Codeforces Round #428 (Div. 2)
- Golang模板语法
- 多继承多态
- 二叉树遍历的非递归实现
- iptables防火墙工作原理
- (HDU
- html 页面内锚点定位及跳转方法总结
- C++primer第五版第三章答案(1)
- void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
- box-flex实现三等分布局
- Boost电路调试经验总结
- HDU6097-Mindis
- Noip2014 Day2 T3 解方程(数论+取模运算)
- POJ 2486_Apple Tree