HDU 2077 汉诺塔IV【递推】
2015-12-10 10:45
337 查看
Problem Description
还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。
Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
Output
对于每组输入数据,最少需要的摆放次数。
Sample Input
Sample Output
还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。
Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
Output
对于每组输入数据,最少需要的摆放次数。
Sample Input
2 1 10
Sample Output
2 19684
/* a[i]表示将i个从最左移到最右且只能小在上大在下的最少步骤数 b[i]表示将i个从最左移到最右且允许最大放在最上面的最少步骤数 c[i]表示将i个从最左移到中间且只能小在上大在下的最少步骤数 显然c[i]也可以表示将i个从最右移到中间且只能小在上大在下的最少步骤数 a[i]的实现过程: 由汉诺塔III可知:a[i]=3*a[i-1]+2; b[i]的实现过程:①将i-1个从最左移到中间且只能小在上大在下,即c[i-1] ②将最左最底下第i个移到中间i-1个的最上面 ③将中间最上的第i个移到最右 ④将中间i-1个移到最右且只能小在上大在下,即c[i-1]. 合计:b[i]=2*c[i-1]+2; c[i]的实现过程:①将i-1个从最左移到最右且只能小在上大在下,即a[i-1]; ②将最左最底下的第i个移到中间 ③将最右的i-1个移到中间且只能小在上大在下,即c[i-1]. 合计:c[i]=a[i-1]+c[i-1]+1; 初始化:a[1]=2;b[1]=2;c[1]=1. */ #include <stdio.h> #define maxn 21 int main() { long long a[maxn] = { 0,2 }, b[maxn] = { 0,2 }, c[maxn] = { 0,1 }; for (int i = 2;i < maxn;i++) { a[i] = 3 * a[i - 1] + 2; c[i] = a[i - 1] + c[i - 1] + 1; b[i] = 2 * c[i - 1] + 2; } int n, t; scanf("%d", &t); while (t--) { scanf("%d", &n); printf("%I64d\n", b ); } return 0; }
相关文章推荐
- JSON序列化与反序列化一个集合
- Installation failed with message INSTALL_FAILED_UID_CHANGED.--APK安装失败解决方法
- n个人围一圈报数问题
- MapReduce:详解Shuffle过程
- iDaily的诞生
- 【springmvc+mybatis项目实战】杰信商贸-13.购销合同列表
- 我始终相信努力奋斗的意义
- js日期处理:LongToDate(long型转换成日期格式)
- ARM7ldr指令与ldr伪指令
- Linux上Python的安装升级
- IOS开发中的CGFloat、CGPoint、CGSize和CGRect
- linux内存占用问题
- Python第三方库使用 —— PIL
- DIV+CSS实操六:经管系网页添加导航栏下拉菜单
- 关于Fragment 不响应onActivityResult的情况分析
- Assembly x64 Intro - Stack frame layout on x86-64
- HDU 2064 汉诺塔III【递推】
- cocos2d-x3.0 相对布局(一)
- intellij idea exclude from compile后怎么加回来
- Android 自制的一个简单的心电图pulseview