博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018/12/21 HDU-2077 汉诺塔IV(递归)
阅读量:5154 次
发布时间:2019-06-13

本文共 1100 字,大约阅读时间需要 3 分钟。

汉诺塔IV

> > Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K
(Java/Others) Total Submission(s): 10905 Accepted Submission(s):
7541

Problem Description

还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。

Input 输入数据的第一行是一个数据T,表示有T组数据。 每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。

Output 对于每组输入数据,最少需要的摆放次数。

Sample Input 2 1 10

Sample Output 2 19684

解题思路:

因为每次只能够移一格,最大的可以放在最上面,所以:
先把前n-1个从a移动到b,第n个移动两次到c
再移动n-1个到c。
设从a→c移动次数为f(n)
分类:
①h(n)=f(n-1)+2
//第n个移动的情况,前n-1个只需移动一大次,加上最大的移动两次。(最好画图)
②f(n)=3f(n-1)+2
//剩下n-1个移动的情况:大的不能在小的上方,所以n-2个需要从a到c(a到c移动两次),c到a,a再到c。所以是三次大移动。

.

#include
using namespace std;int main(){
long long int a[25]; a[0] = 2; for (int i=1;i<20;i++) {
a[i] = a[i - 1] * 3 + 2; } int n, m;///m为组数,n为需要移动的个数 cin >> m; for (int i = 0; i < m; i++) {
long long x = 0; cin >> n; switch (n) {
case 1:x = 2; break; case 2:x = 4; break; default:x = a[n - 2] + 2; break; } cout << x << endl; } return 0;}

各参数

转载于:https://www.cnblogs.com/gidear/p/10433317.html

你可能感兴趣的文章
LintCode-Backpack
查看>>
查询数据库锁
查看>>
我对于脚本程序的理解——百度轻应用有感
查看>>
面试时被问到的问题
查看>>
注解小结
查看>>
list control控件的一些操作
查看>>
判断字符串在字符串中
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
CSS属性值currentColor
查看>>
Real-Time Rendering 笔记
查看>>
实验四2
查看>>
多路复用
查看>>
Java学习笔记--字符串和文件IO
查看>>
在js在添版本号
查看>>
sublime3
查看>>
js编写时间选择框
查看>>
JIRA
查看>>