汉诺塔IV,汉诺塔V
汉诺塔IV
Problem Description
还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。
Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
Output
对于每组输入数据,最少需要的摆放次数。
Sample Input
2
1
10
Sample Output
2
19684
对于汉诺塔III,每次移动 i 个时,a[i] = a[i-1]*3。即移动 i 个到3,需要把前 i-1 个移到3(移a[i-1]次),然后把第 i 个移到2(1次),再把前 i -1个借2移到1(移a[i-1]次),再把第 i 个移到3(1次),再把 i-1 个移到3(移a[i-1]次),所以移动 i 个从1到3,a[i] = a[i-1]*3+2。而汉诺塔IV要求最大的可以放在最上面,即第 n 个可以放在最上面,那么前 n-1 个仍然遵循前面的规律,a[i] = a[i-1]*3+2,最后一个 n ,只需要在前n-1个移到2时,移到2再移到3,移动两次,所以总的次数为a[n] = a[n-1]+2,而a[n-1]又按a[i] = a[i-1]*3+2的规律。
#include<stdio.h>int main()
{int t,n,a[25];scanf("%d",&t);a[0] = 0;a[1] = 2;while(t--){scanf("%d",&n);for(int i = 2; i<n; i++)a[i] = a[i-1]*3+2;//前n-1 个都是按这个规律,即首先把i-1个盘子从1移到2,再把它移到3,需要的次数即a[i-1],然后把第i个移到2,再把移到3的i-1个先移到2再移到1,把i移到3,再把i-1移到3,中间经历了三次a[i-1]a[n] = a[n-1]+2;//因为允许 最大 的盘子放上面,所以最大的盘子从 1 移到 3 只需两步printf("%d\n",a[n]);}return 0;
}
汉诺塔V
Problem Description
用1,2,…,n表示n个盘子,称为1号盘,2号盘,…。号数大盘子就大。经典的汉诺塔问题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。我们知道最少需要移动2^64-1次.在移动过程中发现,有的圆盘移动次数多,有的少 。 告之盘子总数和盘号,计算该盘子的移动次数.
Input
包含多组数据,首先输入T,表示有T组数据.每个数据一行,是盘子的数目N(1<=N<=60)和盘号k(1<=k<=N)。
Output
对于每组数据,输出一个数,到达目标时k号盘需要的最少移动数。
Sample Input
2
60 1
3 1
Sample Output
576460752303423488
4
第 n-1 个盘的移动次数等于第 n 个盘的移动次数的两倍,而最后一个盘只需要移动一次,即第 m 个盘的移动次数等于 2的n-m次方
#include<stdio.h>
#include<math.h>
//第 n-1 个盘的移动次数等于第 n 个盘的移动次数的两倍,而最后一个盘只需要移动一次
//即第 m 个盘的移动次数等于 2的n-m次方
int main()
{int n,t,i,j,s;scanf("%d",&t);while(t--){scanf("%d%d",&n,&i);printf("%I64d\n",(__int64)pow(2.0,n-i));}return 0;
}
汉诺塔IV,汉诺塔V相关推荐
- 汉诺塔III 汉诺塔IV 汉诺塔V
汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI、汉诺塔VII
汉诺塔II:(hdu1207) /先说汉若塔I(经典汉若塔问题),有三塔,A塔从小到大从上至下放有N个盘子,现在要搬到目标C上, 规则小的必需放在大的上面,每次搬一个,求最小步数.这个问题简单,DP: ...
- 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI
汉诺塔 汉诺塔II hdu1207: 先说汉若塔I(经典汉若塔问题),有三塔,A塔从小到大从上至下放有N个盘子,现在要搬到目标C上, 规则小的必需放在大的上面,每次搬一个,求最小步数.这个问题简单,D ...
- HDU2077 汉诺塔IV【递推+打表】
汉诺塔IV Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- 汉诺塔II|汉诺塔4柱
汉诺塔II|汉诺塔4柱 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根 ...
- 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
import java.math.BigInteger; /* * 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序 ...
- 【递推】HDU1207汉诺塔II 【汉诺塔及汉诺塔变形 归纳】
汉诺塔问题 设f(n)为移动n层的汉诺塔的解,则整个过程其实分为三步: 把n-1层移到第二个上面去(花费f(n-1)) 把最大的移到第三个柱子上面去(花费1) 把n-1层移动到第三个柱子上去(花费f( ...
- 一、汉诺塔问题 汉诺塔是由三根杆子A,B,C组成的。A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆
一.汉诺塔问题 汉诺塔是由三根杆子A,B,C组成的.A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘:大盘不能叠在小盘上面.提示: ...
- hanoi塔(汉诺塔)--C语言
hanoi塔(汉诺塔)–C语言 一.什么是hanoi塔 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄 ...
最新文章
- webstorm打包rn项目_React 之 项目搭建
- linux stdin STDIN_FILENO 区别
- #ifdef __cplusplus extern “C” { #endif的作用!
- nginx加密,访问接口认证
- ABAP中Conversion Routine示例
- 云钉一体应用创新:音视频如何带来灵活高效的协同体验
- php 垂直搜死哦,垂直搜索(Vertical Search)的详细介绍
- 第一章 Burp Suite 安装和环境配置
- mysql批量添加报错_技术分享 | MySQL 在批量插入时捕捉错误信息
- 使用ctime.h头文件来控制程序延时秒数
- 5个好用的搜索小技巧:搜索引擎的办法
- 微商公社新兵连第一天
- AI芯片产业生态及竞争格局:英伟达、谷歌、BAT实力拆解对比
- 【C++】C++格式化输出/输出格式控制/输出精度控制
- Springboot + Spring Security 实现前后端分离登录认证及权限控制
- 【转帖】赤壁之战,曹操大败只因缺了Service Mesh
- 古有穷书生街中弄笔,今有弄潮儿网上卖字
- 25分钟破亿 首销火爆的moto edge X30给友商们出了个难题
- HL7解析类的使用(java)
- java为什么要抛出异常_java抛出异常是怎么回事?