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)相关推荐

  1. 汉诺塔(Hanoi Tower)

    问题分析 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. ...

  2. 汉诺塔c语言做法:汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘

    汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题.借助c杆将所有的圆盘移到b杆上,每次只能移一个,且小的盘子一定在大的盘子上面 它来自于印度神话.上帝创造世界时作了三根金刚石柱子,在第一根柱子上 ...

  3. 汉诺塔(Hanoi)移动步骤问题

    汉诺塔 (Hanoi) 规则:把n个盘子从A柱,移动到C柱,中间可以使用B柱,把移动的步骤及移动的步数打印出来.( 递归方法 ) #include <stdio.h>int step = ...

  4. 汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示。

    汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题.它来自于印度神话.上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示.上帝命令婆罗门把圆盘从下 ...

  5. 百练OJ:4147:汉诺塔问题(Hanoi)——python实现汉诺塔

    一.汉诺塔问题 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘 ...

  6. 汉诺塔(hanoi)、双色汉诺塔(分离型)、三色汉诺塔

    汉诺塔 汉诺塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家Edouard Luca ...

  7. 汉诺塔(Hanoi) ——递归思想

     汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.传说故事可以点这看. 汉诺塔问题是一个经典的数学难题,由 3 根柱子和多个半径不等的圆盘构成,如下图所示: 汉诺 ...

  8. 玩转汉诺塔(hanoi)游戏

    汉诺塔由来 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由 ...

  9. 汉诺塔(hanoi)问题(C语言,递归)

    一.什么是汉诺塔? 设有 a.b. c 共 3 根塔座, 在塔座 a上堆叠 n个盘子, 每个盘大小不同, 只允许小盘在大盘之上,最底层的盘最大.   游戏要求:现在要求将 a上的盘全都移到 c 上,在 ...

最新文章

  1. iPhone PHP获取文件,IOS中获取各种文件的目录路径的方法
  2. Arch Linux PDF格式文件无法显示中文
  3. 【Linux】16.mdc挂载群晖NAS
  4. Laravel大型项目系列教程(一)
  5. 【Envi风暴】基于ENVI平台提取ASTER DEM完整操作步骤(附案例数据)
  6. 数据增强 transform_深度学习-Pytorch框架学习之数据处理篇
  7. SQL查询单表数据(一)
  8. 【Vue】全局过滤器和局部过滤器
  9. pypdf2 存储pdf_PyPDF2:用于PDF文件操作的Python库
  10. TinkPad E40 CentOS 6.5 无线网卡驱动 RTL8191SEvB 安装
  11. IDEA 开启远程调试
  12. 无法启动此程序 因为计算机中丢失msvcr71.dll,msvcr71.dll丢失怎样修复?计算机中丢失msvcr71.dll的解决方法...
  13. freyja最重要的一个功能完成
  14. 数据结构——顺序表的实现
  15. python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...
  16. 全文检索第一篇lucene的使用
  17. 先学vba还是python-以Excel处理为目的学习python还是VBA?
  18. 基于ARM板s3c2440---wifi网卡
  19. c语言硬件控制程序,msp430的一些常用的C语言控制程序---ZLG7289
  20. yp北京理工 拓扑排序+最短路(更新中re)

热门文章

  1. Arcgis Javascript那些事儿(三)---arcgis sever服务器注册关于数据拷贝问题
  2. iptables基本概念详解
  3. 新一代MMO架构(Next Generation MMO Architecture 翻译)
  4. MaxRects纹理合并算法as3实现
  5. 雨松MOMO《Unity 3D游戏开发》源码公布
  6. sass-loader高版本的坑
  7. apache缺省banner_NSFOCUS建议您采取以下措施以降低威胁: * 修改源代码或者配置文件改变SSH服务的缺省banner。...
  8. Spring boot yml文件的书写格式
  9. SQL中 ROW_NUMBER 函数的用法
  10. 怎么把外部参照合并到图纸_怎么对两个图纸内容进行合并操作