HDU2077:汉诺塔IV
2016-07-27 17:06
190 查看
HDU2077
Problem Description
还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。
Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
Output
对于每组输入数据,最少需要的摆放次数。
则F
= f[n-1] + 2 (f为汉诺塔III中的f)
Problem Description
还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。
Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
Output
对于每组输入数据,最少需要的摆放次数。
Sample Input | Sample Output |
---|---|
2 1 10 | 2 19684 |
题解
可看作上面n-1个盘子先移动到b,第n个盘子用两步移动到c,n-1个盘子再从b移动到c则F
= f[n-1] + 2 (f为汉诺塔III中的f)
#include<cstdio> #include<iostream> #define ll long long using namespace std; int n; ll f[40]; int main(){ f[1] = 2; for(int i = 2; i <= 35; i++) f[i] = f[i-1] * 3 + 2; scanf("%d", &n); while(~scanf("%d", &n)) cout<<f[n-1]+2<<endl; return 0; }
相关文章推荐
- 素数求解
- Nginx之location 匹配规则详解
- Squid代理常见错误
- 关于ViewGroup的触摸事件拦截
- android TypedValue.applyDimension()的作用
- 16727
- UNITY里用的一些C#宏
- parseInt()和replace()方法
- CodeForces 448D Multiplication Table (二分 )
- oracle分页查询数据重复问题
- 官方 eclipse 在线安装 MyBatis Generator
- 初学android-简单的图灵机器人
- Redis 使用场景-电商
- Redis实现简单的消息队列
- Android.mk文件语法规范及使用模板
- VB,VBS,VBA,ASP可引用的库参考
- 08-掌握-GCD线程间通信
- 关于NFC芯片选择的一些记录
- 计算机网络面试相关
- 在windows下使用VirtualEnv