投稿  收藏 
汉诺塔问题求解。相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有3根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把

汉诺塔问题求解。相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有3根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。请编写程序,实现从键盘上输入一个小于等于64的正整数表示金盘数,打印出移动的步骤。

汉诺塔问题求解。相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有3根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。请编写程序,实现从键盘上输入一个小于等于64的正整数表示金盘数,打印出移动的步骤。

【分析】依题意可将其抽象为一个数学问题,如上图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移动一个盘子且大盘子不能在小盘子上面,求移动的步骤。其间,可以利用B柱子作为中间过渡。

当n=1时

第1次1号盘A----﹥C  js=1次

当n=2时

第1次1号盘A----﹥B

第2次2号盘A----﹥C

第3次1号盘B----﹥C  js=3次

当n=3时

第1次1号盘A----﹥C

第2次2号盘A----﹥B

第3次1号盘C----﹥B

第4次3号盘A----﹥C

第5次1号盘B----﹥A

第6次2号盘B----﹥C

第7次1号盘A----﹥C  js=7次

不难发现规律:1个圆盘移动的次数是2的1次方减1

2个圆盘移动的次数是2的2次方减1

3个圆盘移动的次数是2的3次方减1

------

n个圆盘移动的次数2的n次方减1

故:移动次数为2n-1

【算法描述】

通过上面的分析不难发现,本例问题求解应通过函数递归调用来实现。可以简单分为三个步骤。

第一步:把n-1个盘子由A移到B

第二步:把第n个盘子由A移到C

第三步:把n-1个盘子由B移到C

(1)自定义一个递归函数mov(),其包含四个参数分别表示金盘个数、A杆、B杆与C杆上的个数,并且该函数的函数体包含自调用语句;

(2)由主函数调用mov()函数,且金盘总数由键盘输入,最后输出每一步的过程;

(3)输出结果,结束程序。

【参考程序】

汉诺塔问题求解。相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有3根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。请编写程序,实现从键盘上输入一个小于等于64的正整数表示金盘数,打印出移动的步骤。

【运行情况】

汉诺塔问题求解。相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有3根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。请编写程序,实现从键盘上输入一个小于等于64的正整数表示金盘数,打印出移动的步骤。

关 键 词

汉诺塔问题求解

相关教程

汉诺塔问题求解。相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有3根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把
自定义一个求梯形面积的函数area( ),实现根据给定的梯形的上底、下底和高,求梯形的面积。
C++常用的数学函数
有一个5人的数学兴趣小组进行了一次测试(满分为100分),测试成绩出来后,请你编写一程序,实现录入这5位学生的测试成绩,并找出测试成绩最高与最低的学生信息,其中学生信息包含学生编号、姓名、性别和测试成
一个项目学习小组有6位学生,他们在一次考试中考了5门课,考试成绩如下表所示。请编写一程序,利用结构体类型相关知识实现录入下表中的成绩并求每个人的总成绩。
编写一程序,实现将一个2×3的矩阵转变为一个3×2的矩阵。
一个项目学习小组有6位学生,他们在一次考试中考了5门课,考试成绩如下表所示。请编写一程序,实现录入下表中的成绩并求每个人的总成绩和各学科的平均分。
有这样一个数序:0,1,1,2,3,5,8,13,21,……从第三项起,每一项等于其前两项的和,这就是著名的斐波那契数列。请编写一程序,求该数列前30项(包含第30项)的和。
编写一程序,实现从键盘上输入10个整数,然后将其反向输出。
将下列数学中的算式转化为C++语言的算术表达式并编写程序输出表达式的值。

提示声明

  • 免责声明:本站资源均来自网络或者用户投稿,仅供用于学习和交流:如有侵权联系删除!

猜你喜欢