汉诺塔问题动态演示
- 格式:ppt
- 大小:500.00 KB
- 文档页数:50
XXXX大学计算机科学与技术学院课程设计报告2012 — 2013学年第一学期课程名称C/C++高级语言程序设计课程设计设计题目小游戏和图形处理汉诺塔问题学生姓名XXX学号XXXXXXX专业班级XXXXXXXXXXX指导教师XX2012 年X 月XX 日目录一、课程设计问题描述 (1)1、课程设计题目 (1)2、设计任务要求 (1)二、总体设计 (1)1、设计思路 (1)2、汉诺塔求解流程图 (2)三、详细设计 (2)1、汉诺塔问题描述 (2)2、算法分析 (3)3、实现递归的条件 (4)4、用C语言实现 (4)四、程序运行结果测试与分析 (4)1、打开Microsoft Visual C++ 6.0操作平台输入以下的源代码 (4)2、编译源代码 (5)3、组建 (5)4、执行 (5)5、运行结果 (6)6、按任意键结束程序 (7)五、结论与心得 (7)六、参考文献 (8)七、附录:程序源代码 (8)一、课程设计问题描述1、课程设计题目汉诺塔问题2、设计任务要求输入盘子数(2个以上有效),移动速度,开始演示汉诺塔移动的步骤,要求:盘子A,B,C柱需要自己绘制,初始时盘子在A柱上通过B柱最终移动到C 柱上,显示出盘子在几个柱之间的移动过程。
二、总体设计1、设计思路对于一个类似的这样的问题,任何一个人都不可能直接写出移动盘子的每一个具体步骤。
可以利用这样的统筹管理的办法求解:我们假设把该任务交给一个僧人,为了方便叙述,将他编号为64。
僧人自然会这样想:假如有另外一个僧人能有办法将63个盘子从一个座移到另一个座,那么问题就解决了,此时僧人A B C64只需这样做:(1).命令僧人63将63个盘子从A座移到C座(2).自己将最底下的最大的一个盘子从A座移到C座(3).再命令僧人63将63个盘子从B座移到C座为了解决将63个盘子从A座移到B座的问题,僧人63又想:如果能再有一个僧人62能将62个盘子移动到另一座,我就能将63个盘子从A座移动到B座。
【算法】汉诺塔问题汉诺塔问题是⼀个经典的问题。
汉诺塔(Hanoi Tower),⼜称河内塔,源于印度⼀个古⽼传说。
⼤梵天创造世界的时候做了三根⾦刚⽯柱⼦,在⼀根柱⼦上从下往上按照⼤⼩顺序摞着64⽚黄⾦圆盘。
⼤梵天命令婆罗门把圆盘从下⾯开始按⼤⼩顺序重新摆放在另⼀根柱⼦上。
并且规定,任何时候,在⼩圆盘上都不能放⼤圆盘,且在三根柱⼦之间⼀次只能移动⼀个圆盘。
问应该如何操作?当只有⼀个盘⼦时这是最简单的情况:只需将1号盘⼦从X塔移动到Z塔就OK于是我们可以写出如下的函数,来模拟完成这个过程。
假设盘⼦是⽤1,2,3...按照⼤⼩编码代表的,⽽塔则是⽤⼀个字符char表⽰的。
//将编号为 number 的盘⼦从 from 塔座移到 to 塔座void move(int number , char from , char to){std::cout<<"move dish "<<number<<": "<<from<<"--->"<<to<<std::endl;}有两个盘⼦时有2个盘⼦,⽬标是:将X塔上的盘⼦借助Y移动到Z盘⼦上。
特别的,为了好描述,我把X塔叫做源塔,因为盘⼦起初在这个塔上,把Y塔叫做辅助塔,因为Y塔只是起个过渡作⽤。
把Z盘叫做⽬标塔,最后所以的盘⼦都在这个塔上。
我们可以写出伪代码move(1,X,Y);move(2,X,Z);move(1,Y,Z);有三个盘⼦时在盘⼦数⼤于2的时候,⽆论有多少个盘⼦,我们眼⾥只有2个盘⼦:即最底层的最⼤的盘⼦,和它上⾯的所有盘⼦组和形成的⼀个盘,我们可以把它看做是2.5号盘。
这样考虑的好处是:⽆论有多少盘⼦,都可以⽤2个盘⼦的思路去做。
简化了思路。
因此,步骤是:1、将2.5号盘借助Z塔移动到Y塔上。
注意,处理这步操作时,X是源塔,Z是辅助塔,Y是⽬标塔2、将3盘移动到Z塔上,3、将2.5盘借助X塔移动到Z塔上。
汉诺塔移动超详细步骤分解4到6层关键信息项:1、汉诺塔层数:4 层、5 层、6 层2、移动规则3、具体移动步骤4、示例说明11 汉诺塔简介汉诺塔(Tower of Hanoi)是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
111 规则说明在移动汉诺塔的过程中,需遵循以下规则:每次只能移动一个圆盘。
较大的圆盘不能放在较小的圆盘上面。
112 四层汉诺塔移动步骤第一步:把最上面的三个圆盘从第一根柱子移动到第二根柱子。
这需要 7 步,依次为:1 号盘从 A 到 C,2 号盘从 A 到 B,1 号盘从 C 到B,3 号盘从 A 到 C,1 号盘从 B 到 A,2 号盘从 B 到 C,1 号盘从 A到 C。
第二步:把第四层的大盘从第一根柱子移动到第三根柱子。
第三步:把第二根柱子上的三个圆盘按照同样的规则移动到第三根柱子。
这也需要 7 步。
113 五层汉诺塔移动步骤首先,将上面四层从第一根柱子移动到第二根柱子,这需要15 步。
接着,把第五层的圆盘从第一根柱子移动到第三根柱子。
最后,把第二根柱子上的四层按照规则移动到第三根柱子,同样需要 15 步。
114 六层汉诺塔移动步骤初始时,将上面五层从第一根柱子移动到第二根柱子,共需31 步。
然后,把第六层的圆盘从第一根柱子移动到第三根柱子。
最后,把第二根柱子上的五层依照规则移动到第三根柱子,此过程同样需要 31 步。
12 示例说明为了更清晰地理解汉诺塔的移动步骤,我们以四层汉诺塔为例进行逐步演示。
假设三根柱子分别为 A、B、C,初始时四层圆盘都在 A 柱上。
第一步,1 号盘从 A 移动到 C,此时状态为:A 柱上剩下 2、3、4号盘,C 柱上有 1 号盘。
汉诺塔解法原理汉诺塔是一道经典的递归问题。
要解决汉诺塔问题,我们需要了解一些递归和分治的基本原理。
汉诺塔问题描述汉诺塔问题是指在一根柱子上按大小顺序放置 N 个盘子,大盘子在下面,小盘子在上面。
现在要求将这些盘子全部移到另一个柱子上,可以借助中间的柱子,但是要满足在移动的过程中始终保持大盘子在下、小盘子在上的原则。
汉诺塔解法汉诺塔问题可以用递归算法求解。
具体解法分为三个步骤:1. 将 n-1 个盘子从 A 移动到 B(借助 C)2. 将第 n 个盘子从 A 移动到 C3. 将 n-1 个盘子从 B 移动到 C(借助 A)其中,第 1 步和第 3 步是递归步骤,第 2 步是基础步骤。
在第 1 步和第 3 步中,我们需要先将 n-1 个盘子从 A 移动到 B(或从 B 移动到A),这是通过递归调用将问题规模缩小实现的。
当问题规模足够小时,基础步骤中进行盘子移动的操作就可以解决问题。
递归基本原理递归算法是一种非常高效的算法,可以解决许多问题。
在使用递归算法时,我们需要注意以下几点:1. 递归函数必须有一个基准条件,这个条件用于判断递归何时停止;2. 递归函数必须能够缩小问题规模,这样才能使得递归过程终止;3. 递归函数必须能够不断地将问题分解为同样的形式,这样才能简化递归算法的实现。
1. 分治算法必须要有一个基础步骤,这个步骤可以解决问题的一部分;2. 分治算法必须能够将问题分为若干个子问题,这些子问题与原问题形式相同;3. 子问题必须能够递归地求解。
总结汉诺塔问题是一道经典的递归问题,可以用递归算法求解。
递归算法的基本原理是基准条件、问题规模缩小和问题形式简化。
重点在递归的时候能够将问题不断缩小,同时保证在基础步骤中能够解决问题的一部分。
分治算法与递归类似,也是一种高效的算法。
分治算法的基本原理是基础步骤、问题分解和递归求解。
分治算法能够将问题分解成若干个子问题,这些子问题与原问题形式相同,这样就能够简化算法实现。
汉诺塔问题演示课程设计一、课程目标知识目标:1. 学生能理解汉诺塔问题的起源、规则及数学原理;2. 学生掌握运用递归思想解决汉诺塔问题的方法;3. 学生了解汉诺塔问题与数学归纳法的关系。
技能目标:1. 学生能够运用所学知识编写程序解决汉诺塔问题;2. 学生通过小组合作,培养团队协作能力和问题解决能力;3. 学生能够运用数学归纳法分析汉诺塔问题,提高逻辑思维能力。
情感态度价值观目标:1. 学生对数学问题产生兴趣,培养探究精神和创新意识;2. 学生在解决汉诺塔问题的过程中,树立克服困难的信心,培养坚韧不拔的品质;3. 学生通过课程学习,认识到数学在现实生活中的应用价值,提高数学学习的积极性。
本课程针对高年级学生,结合学科特点,强调理论与实践相结合,注重培养学生的逻辑思维能力和实际操作能力。
课程设计以汉诺塔问题为主线,引导学生通过小组合作、自主探究等方式,掌握递归思想和数学归纳法在实际问题中的应用。
课程目标具体、可衡量,旨在让学生在课程结束后能够独立解决汉诺塔问题,并在此过程中培养情感态度价值观。
本课程教学内容主要包括以下三个方面:1. 汉诺塔问题背景介绍:- 汉诺塔问题的起源及发展历程;- 汉诺塔问题的基本规则;- 汉诺塔问题与数学归纳法的关系。
2. 汉诺塔问题的数学原理:- 递归思想及其在汉诺塔问题中的应用;- 数学归纳法的基本概念及运用;- 汉诺塔问题解法与数学公式推导。
3. 汉诺塔问题实践操作:- 编写程序解决汉诺塔问题;- 小组合作探讨汉诺塔问题的优化解法;- 分析汉诺塔问题在不同条件下的解法及规律。
教学内容依据课程目标,结合教材相关章节进行组织。
具体教学大纲如下:1. 引言与背景介绍(1课时);2. 汉诺塔问题的数学原理(2课时);3. 汉诺塔问题实践操作(2课时);4. 拓展与提高(1课时)。
教学内容具有科学性和系统性,旨在帮助学生从理论到实践,全面掌握汉诺塔问题的解法及其数学原理。
同时,注重培养学生的团队合作能力和问题解决能力。
汉诺塔论⽂⽬录⽬录 (1)摘要 (2)⼀、背景知识 (3)⼆、问题重述 (3)三、算法分析 (3)四、流程及程序设计 (5)(1)、流程图 (5)(2)、模块及其功能介绍 (6)五、调试与算法复杂度分析 (7)(1)、运⾏结果 (7)(2)、H ANOI塔问题复杂度分析 (9)总结 (10)参考⽂献 (11)附录 (12)摘要汉诺威塔是⼀款集娱乐与运算的智⼒游戏,它不仅能使⼈在休闲的时候放松⼼情,⽽且还能在玩的过程中不断的提⾼你的思维能⼒。
有三个柱⼦A, B, C。
A柱⼦上叠放有n个盘⼦,每个盘⼦都⽐它下⾯的盘⼦要⼩⼀点,可以从上到下⽤1, 2, ..., n编号。
要求借助柱⼦C,把柱⼦A上的所有的盘⼦移动到柱⼦B上。
移动条件为:1、⼀次只能移⼀个盘⼦2、移动过程中⼤盘⼦不能放在⼩盘⼦上,只能⼩盘⼦放在⼤盘⼦上本⽂的主要算法是利⽤函数的递归调⽤算法。
⾸先,想办法将A座上的前n-1个盘借助C座移动到B座上,然后将A组上的第n个盘移动到C座上。
然后再将B座上的n-1个盘借助A座移动到C座上,此次移动也和第⼀次移动⼀样,重复递归,直到最后⼀个盘为⽌。
关键词:汉诺塔递归思想函数调⽤数组指针⼀、背景知识汉诺塔(⼜称河内塔)问题来⾃中东地区⼀个古⽼的传说:在世界刚被创建的时候有⼀座钻⽯宝塔(塔A),其上有64个⾦碟。
所有碟⼦按从⼤到⼩的次序从塔底堆放⾄塔顶。
紧挨着这座塔有另外两个钻⽯宝塔(塔B和塔C)。
从世界创始之⽇起,婆罗门的牧师们就⼀直在试图把塔A上的碟⼦移动到塔C上去,其间借助于塔B 的帮助。
每次只能移动⼀个碟⼦,任何时候都不能把⼀个碟⼦放在⽐它⼩的碟⼦上⾯。
当牧师们完成任务时,世界末⽇也就到了。
19世纪的法国⼤数学家鲁卡曾经研究过这个问题,他正确地指出,要完成这个任务,僧侣们搬动⾦盘的总次数(把1个⾦盘从某个塔柱转移到另1个塔柱叫做1次)为:18,446,744,073,709,551,615次。
假设僧侣们个个⾝强⼒壮,每天24⼩时不知疲倦地不停⼯作,⽽且动作敏捷快速,1秒钟就能移动1个⾦盘,那么,完成这个任务也得花5800亿年!⼆、问题重述有三个柱⼦A, B, C。
汉诺塔游戏教材分析《汉诺塔游戏》编排在人教版小学数学第7册,第111页,《总复习》单元里的一个数学思考。
首先我把本课定位为数学游戏课,学生要学会动手操作,按照规则达到游戏目标。
其次是数学思想课,在本课中给学生渗透递归的思想,即在探究中发现三层、四层、五层圆盘最少移动次数的内在规律,并推测出移动更多圆盘的最少次数。
每一次移动的最少步数就是上次移动的最少步数的2倍再加一。
“直接调用上一次的结论”,跟煎饼问题有类似之处。
第三定位为数学科普课,也就是汉诺塔游戏,来自于古印度的一个传说。
学情分析班上除极个别的学生对汉诺塔游戏有所了解,明白游戏规则和游戏目标,大部分学生拿到学具以后,都会随意拨弄。
甚至在上课时会忍不住,不听老师的统一要求。
这节课最容易失控的地方就是同学们拿到学具以后“瞎玩”。
怎么避免?自己动手操作可能出现两种情况,一是玩不出、达不到目标,二是能达到目标。
达到目标又分两种情况,一是运气好正好猜中了步骤(如果是运气好正好用最少的步数达到了目标,再玩一次也可能会超过最少步数),二是有计划有目标的移动。
我的教学目标当然是使大多数人学会有计划有目标的移动,达到目的。
教学目标1、了解汉诺塔游戏,以及它的目标和规则。
2、通过动手操作、动脑思考一、二、三层圆盘汉诺塔游戏,学会用最少的步数移动三层汉诺塔圆盘。
明白玩四层、五层……圆盘的操作思路,以及会计算四层、五层的最少操作步数。
3、在数学游戏中感受递归的数学思想,在游戏中提升学习数学的兴趣。
教学重难点重点:掌握移动三个圆盘的具体步骤。
难点:明理、说理,理解三个圆盘的移动方法和最少步数的计算方法。
教学过程教学准备:4层汉诺塔。
每人一个学具。
一、导入:1、认识学具:小朋友们,我们的身边有一些益智游戏,一起来看,这是什么?依次出示:24点、数独、魔方、七巧板、华容道、孔明锁。
今天,老师带来的这个学具,它的名字叫汉诺塔。
板书课题。
我们一起来认识认识它。
说说你看到了什么?(有三根柱子,和一些大小颜色不同的圆盘,这些圆盘由上到小按从小到大堆叠起来)。
Hanoi塔问题Hanoi塔问题是法国数学家Edouard Lucas于1883年提出来的。
传说有一个东方庙宇(一说为印度,一说为越南)开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为过渡,但每次只能搬一个,而且大的不能放在小的上面。
移动圆片的总次数等于2的64次方再减1=18446744073709551615,如果按照最快每秒钟搬动1片的话,就算昼夜不停地干,要花多少时间?1年有365x24x60x60=31536000秒。
所以共需5849亿年!看来,众僧们耗尽毕生精力也不可能完成金片的移动。
这个问题今天已经成为程序设计中的经典的函数递归调用问题。
此外,还有Hanoi塔电子游戏。
一、需求分析⒈本实验要求4个盘子移动,输出中间结果:三个盘子的图为:三个盘子汉诺塔算法的运行轨迹为:Hanio 算法如下:1 void Hanoi (int n, char A, char B, char C ) //第一列为语句行号2 {3 if (n==1) Move (A, C ); //Move 是一个抽象操作,表示将碟子从A 移到C 上4 else {5 Hanoi (n -1, A, C, B );6 Move (A, C );7 Hanoi (n -1, B, A, C );8 }9 }解释:三根柱子x,y,z.其中x 上有n 个直径递增的圆盘(最顶为最小,然后往下一次增大),现在要把x 上的n 个圆盘移到z 上,要求在移动的过程中不允许出现任何大的圆盘叠放在任何小的圆盘上,柱y 可作中转用).如果柱x 上只有一个圆盘 if(n==1),那么只需要将x 上的这一个圆盘移到z 上即可.程序中的 printf("%c-->%c\n",x,z); 就是把移动的方向打印出来显示在屏幕上.否则(即柱上X 上有不止一个圆盘)else { move(n-1,x,z,y); printf("%c-->%c\n",x,z); move(n-1,y,x,z); }我们先把柱x 上 最上面的(n-1)个圆盘移到柱y(记住柱y 本来就是作中转用的) 上(先不要去深究这n-1个圆盘怎么移得到柱y 上,假设能办到), move(n-1,x,z,y); 注 意此时我们的x,y,z 的角色变了.我们要从x 上移动圆盘到y 上了.你不妨这样标记一 下move 形参 move(圆盘数,来源柱,中转柱,目标柱).就是说现在x 的角色是来源柱,y 的角色是目标柱,我们要把x 上的n-1个圆盘移到y 上.⑸ ⑼ ⑶ Hanio(3,A,B,C) Hanio(3,A,B,C) Hanio(2,A,C,B) Hanio(2,A,C,B) Hanio(1,A,B,C) Hanio(1,A,B,C) Move (A,C) Move (A,B) Hanio(1,C,A,B) Hanio(1,C,A,B) Move (C,B) Move (A,B)Hanio(2,B,A,C) Hanio(2,B,A,C) Hanio(1,B,C,A) Hanio(1,B,C,A) Move (B,C) Hanio(1,A,B,C) Hanio(1,A,B,C) Move (A,C) Move (B,A) 递归第一层 递归第二层 递归第三层 ⑴ ⑵ ⑷⑹ ⑺ ⑻ ⑽⑾ ⑿ ⒀ ⒁这一步完成之后,我们就该把剩在柱x上的那个最大的圆盘移到柱z上了.printf("%c-->%c\n",x,z);现在我们的状态是最大的圆盘已经在z上,其余的n-1个在y上,x上没有圆盘.我们在交换一下x,y,z的角色: move(n-1,y,x,z); 对照move(圆盘数,来源柱,中转柱,目标柱), 我们要把y上剩余的n-1个圆盘移到z上. 自此,n个圆盘全都从x上移到了z上.以此类推,四个盘子的Hanoi塔的问题也是如此解决。