Bailian4147 汉诺塔问题(Hanoi)
4147:汉诺塔问题(Hanoi)
总时间限制: 1000ms 内存限制: 65535kB
描述
一、汉诺塔问题
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
汉诺塔示意图如下:
三个盘的移动:
二、故事由来
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时, 假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下: 18446744073709551615秒 这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
三、解法
解法的基本思想是递归。假设有A、B、C三个塔,A塔有N块盘,目标是把这些盘全部移到C塔。那么先把A塔顶部的N-1块盘移动到B塔,再把A塔剩下的大盘移到C,最后把B塔的N-1块盘移到C。 每次移动多于一块盘时,则再次使用上述算法来移动。
输入
输入为一个整数后面跟三个单字符字符串。
整数为盘子的数目,后三个字符表示三个杆子的编号。
输出
输出每一步移动盘子的记录。一次移动一行。
每次移动的记录为例如3:a->b 的形式,即把编号为3的盘子从a杆移至b杆。
我们约定圆盘从小到大编号为1, 2, …n。即最上面那个最小的圆盘编号为1,最下面最大的圆盘编号为n。
样例输入
3 a b c
样例输出
1:a->c
2:a->b
1:c->b
3:a->c
1:b->a
2:b->c
1:a->c
问题链接:Bailian4147 汉诺塔问题(Hanoi)
问题简述:(略)
问题分析:
这是一个经典的问题,使用递归程序来解。
程序说明:(略)
参考链接:(略)
题记:(略)
AC的C语言程序如下:
/* Bailian4147 汉诺塔问题(Hanoi) */#include <stdio.h>void move(int lvl, int x, int z)
{printf("%d:%c->%c\n", lvl, x, z);
}void hanoi(int lvl, char from, char tmp, char to)
{if(lvl == 1)move(1, from, to);else {hanoi(lvl - 1, from, to, tmp);move(lvl, from, to);hanoi(lvl - 1, tmp, from, to);}
}int main(void)
{int n;char a, b, c;while(scanf("%d %c %c %c", &n, &a, &b, &c) != EOF)hanoi(n, a, b, c);return 0;
}
Bailian4147 汉诺塔问题(Hanoi)相关推荐
- 汉诺塔(Hanoi Tower)
问题分析 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. ...
- 汉诺塔c语言做法:汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘
汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题.借助c杆将所有的圆盘移到b杆上,每次只能移一个,且小的盘子一定在大的盘子上面 它来自于印度神话.上帝创造世界时作了三根金刚石柱子,在第一根柱子上 ...
- 汉诺塔(Hanoi)移动步骤问题
汉诺塔 (Hanoi) 规则:把n个盘子从A柱,移动到C柱,中间可以使用B柱,把移动的步骤及移动的步数打印出来.( 递归方法 ) #include <stdio.h>int step = ...
- 汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示。
汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题.它来自于印度神话.上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示.上帝命令婆罗门把圆盘从下 ...
- 百练OJ:4147:汉诺塔问题(Hanoi)——python实现汉诺塔
一.汉诺塔问题 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘 ...
- 汉诺塔(hanoi)、双色汉诺塔(分离型)、三色汉诺塔
汉诺塔 汉诺塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家Edouard Luca ...
- 汉诺塔(Hanoi) ——递归思想
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.传说故事可以点这看. 汉诺塔问题是一个经典的数学难题,由 3 根柱子和多个半径不等的圆盘构成,如下图所示: 汉诺 ...
- 玩转汉诺塔(hanoi)游戏
汉诺塔由来 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由 ...
- 汉诺塔(hanoi)问题(C语言,递归)
一.什么是汉诺塔? 设有 a.b. c 共 3 根塔座, 在塔座 a上堆叠 n个盘子, 每个盘大小不同, 只允许小盘在大盘之上,最底层的盘最大. 游戏要求:现在要求将 a上的盘全都移到 c 上,在 ...
最新文章
- iPhone PHP获取文件,IOS中获取各种文件的目录路径的方法
- Arch Linux PDF格式文件无法显示中文
- 【Linux】16.mdc挂载群晖NAS
- Laravel大型项目系列教程(一)
- 【Envi风暴】基于ENVI平台提取ASTER DEM完整操作步骤(附案例数据)
- 数据增强 transform_深度学习-Pytorch框架学习之数据处理篇
- SQL查询单表数据(一)
- 【Vue】全局过滤器和局部过滤器
- pypdf2 存储pdf_PyPDF2:用于PDF文件操作的Python库
- TinkPad E40 CentOS 6.5 无线网卡驱动 RTL8191SEvB 安装
- IDEA 开启远程调试
- 无法启动此程序 因为计算机中丢失msvcr71.dll,msvcr71.dll丢失怎样修复?计算机中丢失msvcr71.dll的解决方法...
- freyja最重要的一个功能完成
- 数据结构——顺序表的实现
- python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...
- 全文检索第一篇lucene的使用
- 先学vba还是python-以Excel处理为目的学习python还是VBA?
- 基于ARM板s3c2440---wifi网卡
- c语言硬件控制程序,msp430的一些常用的C语言控制程序---ZLG7289
- yp北京理工 拓扑排序+最短路(更新中re)
热门文章
- Arcgis Javascript那些事儿(三)---arcgis sever服务器注册关于数据拷贝问题
- iptables基本概念详解
- 新一代MMO架构(Next Generation MMO Architecture 翻译)
- MaxRects纹理合并算法as3实现
- 雨松MOMO《Unity 3D游戏开发》源码公布
- sass-loader高版本的坑
- apache缺省banner_NSFOCUS建议您采取以下措施以降低威胁: * 修改源代码或者配置文件改变SSH服务的缺省banner。...
- Spring boot yml文件的书写格式
- SQL中 ROW_NUMBER 函数的用法
- 怎么把外部参照合并到图纸_怎么对两个图纸内容进行合并操作