汉诺塔问题图解

汉诺塔问题图解
汉诺塔问题图解

C

图1Hanoi求解示意图

图2 汉诺塔算法的运行轨迹

⑾⑿⒀⒁图3 汉诺塔算法执行过程中工作栈变化示意图

汉诺塔课程设计

汉诺塔课程设计 一、教学内容: 1、了解汉诺塔的历史。 2、讲解汉诺塔的游戏规则。 二、课程设计目的: 1、让伙伴们了解汉诺塔的历史,勾起孩子们的学习兴趣,让伙伴们更加热爱数学。 2、在掌握汉诺塔玩法的基础上,锻炼伙伴们的观察力,变通里,和右脑开发。 3、增强伙伴们的空间想象能力和动手能力。 4、让伙伴们体会到数学的神奇,从而对数学产生更加浓厚的兴趣。 三、培养技能:观察力、想象力、变通里、右脑开发。 四、所需工具:汉诺塔、记号笔。 五、教学流程概述: 第一节课:1、讲一个关于汉诺塔的故事。2、带领伙伴们一起观察和了解汉诺塔的游戏规则。(以三盘为例说明)(30分钟) 第二节课:汉诺塔4盘的移法。(30分钟) 第三节课:汉诺塔5盘的移法。(30分钟) 第四节课: 汉诺塔月底考核。(30分钟) 六、教学流程详细解读: 第一节课:让伙伴们了解汉诺塔的历史,勾起孩子们的学习 兴趣,让伙伴们更加热爱数学。 1、讲关于汉诺塔的故事: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄 铜板上插着三根宝石针。印度教的主神梵天在创造世界的时 候,在其中一根针上从下到上地穿好了由大到小的64片金 片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在 按照下面的法则移动这些金片:一次只移动一片,不管在哪 根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移

、告诉伙伴们游戏规则: 以三个环为例说明: (一)先让伙伴们自己观察有几个柱子,有几个盘,并且盘是怎么排列的? 答:有三根相邻的柱子,第一根柱子上从下到上放着3个不同大小的圆盘,并且顺序是由大到小依次叠放。 (二)分别为这3个相邻的柱子编号A柱、B柱、C柱;在为这3个圆盘编号盘1、盘2、盘3。 让伙伴们自己动脑想想:如何要把A柱上的3个盘子一个一个移动到C柱上,并且每次移动同一根柱子上都必须保持大点的盘子在下,小点的盘子在上。最后也要使移动到C 柱的圆盘从下到上按照盘3,2,1金字塔的形状排列。 (三)带领伙伴们一起动手操作: (1)、盘1移动到C柱。 (2)、盘2移动到B柱。 (3)、盘1在移动到B柱上,这时盘1在盘2上。 (4)、盘3移动到C柱上。 (5)、再将盘1移动到A柱,这时B柱就只剩盘2。 (6)、将盘2移动到C柱,在盘3上边。 (7)、再将盘1移动到C柱,这时就成功了。 (四)鼓励伙伴们再来一次,按照刚才的移动方法 将C柱的圆盘移动到A柱。 (五)等所有伙伴都移动成功都移动成功后,引导伙伴们仔细思考,看看各位伙伴在移动的过程中有发现什么规律和技巧没有? 带领伙伴再来熟悉一遍: 第一步:盘1移动到C柱;第二步:盘2移动到B柱;......第四步:盘3移动到C柱上......

scratch图解汉诺塔问题

scratch图解汉诺塔问题 汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘 在进行转移操作时,都必须确保大盘在小盘下面,且每次只能移动一个圆盘,最终c柱上有所有的盘子且也是从上到下按从小到大的顺序。 当a柱子上只有一个盘子时只要把那个盘子直接移到c就行了, 有两个盘子的话把1号盘先移到b柱,在把2号盘移到c柱,最后把b柱上的1号盘移到c柱就行了, 那么如果有n个盘子呢? 这里我们先把上方的n-1个盘子看成整体,这下就等于只有两个盘子,自然很容易了,我们只要完成两个盘子的转移就行了,再把前n-2个盘子看作一个整

体,就这样一步步向前找到可以直接移动的盘子,n-3......,2,1,最终,最上方的盘子是可以直接移动到c柱的。 看到这里其实就已经有了程序的设计思路,那就是递归,这个时候只要理解递归最终的解决的问题是什么就行了,中间的事交给程序,递归可以很绕也可以很直接,我们按照最直接的理解就行了。

如果你想想清楚每一步执行过程,那么你可以继续往下看,确实有点乱,切记别把自己绕晕了。 举个例子:当n=7时,前6个要想办法成功移动到b柱上,7号是Boss,他不管上面的6个小弟用什么办法,我可以先等着,于是7号在等着上面6个完成移到b柱,现在6是临时老大,他也想去c柱,于是他命令前5个移到b 柱,他等着,5号也采取之前两个的做法,于是这个命令一直往前传,没办法,上面被压着自己也没法动啊。 终于到了1号,他是现在唯一能动的,于是1号移动到了b柱,好了,2号可以到c柱。不过a柱上还有3号,于是让1号移到c柱,3号可以到b柱了,之后1号和2号在想办法到b柱,于是1,2,3号在b柱,4号也要得到b柱啊,1,2,3号你们按照刚才的办法到c柱,空出b柱给4号。后面的5号、6号都重复这样的操作,终于前6号移动到b柱,7号直接跑到了c柱,于是剩下在b 柱的6个小弟还要再干一遍他们在a柱上干的事。 程序截图:

汉诺塔程序实验报告

实验题目: Hanoi 塔问题 一、问题描述: 假设有三个分别命名为 A , B 和C 的塔座,在塔座 B 上插有n 个直径大小各不相同、从小到 大编号为1, 2,…,n 的圆盘。现要求将塔座 B 上的n 个圆盘移至塔座 A 上并仍按同样顺序 叠排,圆盘移动时必须遵守以下规则: (1 )每次只能移动一个圆盘; (2)圆盘可以插在 A , B 和C 中任一塔上; ( 3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 要求: 用程序模拟上述问题解决办法,并输出移动的总次数, 圆盘的个数从键盘输入; 并想 办法计算出程序运行的时间。 二、 算法思路: 1 、建立数学模型: 这个问题可用递归法解决,并用数学归纳法又个别得出普遍解法: 假设塔座B 上有3个圆盘移动到塔座 A 上: (1) "将塔座B 上2个圆盘借助塔座 A 移动到塔座C 上; (2) "将塔座B 上1个圆盘移动到塔座 A 上; (3) "将塔座C 上2个圆盘借助塔座 B 移动到塔座A 上。 其中第 2步可以直接实现。第 1步又可用递归方法分解为: 1.1"将塔座B 上1个圆盘从塔座 1.2"将塔座B 上1个圆盘从塔座 1.3"将塔座A 上1个圆盘从塔座 第 3 步可以分解为: 3.1将塔座C 上1个圆盘从塔座 3.2将塔座C 上1个圆盘从塔座 3.3将塔座B 上1个圆盘从塔座 综上所述:可得到移动 3 个圆盘的步骤为 B->A,B->C, A->C, B->A, C->B, C->A, B->A, 2、算法设计: 将n 个圆盘由B 依次移到A , C 作为辅助塔座。当 n=1时,可以直接完成。否则,将塔 座B 顶上的n-1个圆盘借助塔座 A 移动到塔座C 上;然后将圆盘B 上第n 个圆盘移到塔 座A 上;最后将塔座 C 上的n-1个圆盘移到塔座 A 上,并用塔座B 作为辅助塔座。 三、原程序 #include #include #include int times = 0; void move(char a, char b) { printf("%c > %c \n", a,b); } void hno(int n,char a , char b, char c) { if (n==1) { move(a,c); times ++; } X 移动到塔座 A ; X 移动到塔座 C ; Z 移动到塔座 C 。 Y 移动到塔座 Y 移动到塔座 X 移动到塔座 B ; A ;

七层汉诺塔的解法

七层汉诺塔的解法 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 8、把4号从a挪动到b 9、把1号从c挪动到b 10、把2号从c挪动到a 11、把1号从b挪动到a 12、把3号从c挪动到b 13、把1号从a挪动到c 14、把2号从a挪动到b 15、把1号从c挪动到b 16、把5号从a挪动到c 17、把1号从b挪动到a 18、把2号从b挪动到c 19、把1号从a挪动到c 20、把3号从b挪动到a 21、把1号从c挪动到b 22、把2号从c挪动到a 23、把1号从b挪动到a 24、把4号从b挪动到c 25、把1号从a挪动到c 26、把2号从a挪动到b 27、把1号从c挪动到b 28、把3号从a挪动到c 29、把1号从b挪动到a 30、把2号从b挪动到c 31、把1号从a挪动到c 32、把6号从a挪动到b 33、把1号从c挪动到b 34、把2号从c挪动到a 35、把1号从b挪动到a 36、把3号从c挪动到b 37、把1号从a挪动到c 38、把2号从a挪动到b 39、把1号从c挪动到b 40、把4号从c挪动到a 41、把1号从b挪动到a 42、把2号从b挪动到c 43、把1号从a挪动到c 44、把3号从b挪动到a 45、把1号从c挪动到b 46、把2号从c挪动到a 47、把1号从b挪动到a 48、把5号从c挪动到b 49、把1号从a挪动到c 50、把2号从a挪动到b 51、把1号从c挪动到b 52、把3号从a挪动到c 53、把1号从b挪动到a 54、把2号从b挪动到c 55、把1号从a挪动到c 56、把4号从a挪动到b 57、把1号从c挪动到b 58、把2号从c挪动到a 59、把1号从b挪动到a 60、把3号从c挪动到b 61、把1号从a挪动到c 62、把2号从a挪动到b

汉诺塔探趣

“汉诺塔”问题探趣 洞头县实验小学 502班叶钫舟 指导老师洞头县实验小学陈素萍 一、问题的提出: 一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 尽管这个传说并不可信,但现在却成就了一种益智玩具━━“汉诺塔”(如图)的诞生。对下面这个8层汉诺塔,如何按以上要求将所有的圆盘从最左边的柱子上移到最右边的柱子上来呢?并如何保证移动的步子最少呢? 对这个富有挑战性的游戏,我非常有兴趣,于是我开始了研究! 二、研究过程: 1、简化器材,方便携带,随时演练,不断研究 “汉诺塔”游戏器材,体积较大,质量也大,不方便随身携带,因而也不能让我随时随地进行演练。 考虑到它最关键的是体现由小到大的一种排列,我用扑克牌同色的1(A),2,3,4,5,6,7,8来代替这个“汉诺塔”,平时演练,只要假想桌子上有左0、中1、右2三个档位即可,将这8张扑克牌从上到下按由小到大的顺序叠放在一起,放置在左边档位0处,然后将按游戏规则将它们依次全部移到最右边档位2处即可。 我把这种用扑克牌玩“汉诺塔”游戏称为“汉诺牌”,这样就很方便了!有时忘记了带扑克牌,我就用笔在纸上写下1~8这张8张“牌”,就可以玩了!

汉诺塔游戏设计

成绩评定表

课程设计任务书

目录 1目的及基本要求 0 2 汉诺塔游戏原理 (3) 3汉诺塔游戏设计和仿真 (2) 4 具体设计步骤 (3) 4.1 详细步骤 (3) 4.2 主程序前后面板 (9) 4.3 设计中遇到的问题 (12) 5结果及性能分析 (12) 5.1 运行结果 (12) 5.2 性能分析 (14) 参考文献 (14)

1 目的及基本要求 熟悉LabVIEW开发环境,掌握基于LabVIEW的虚拟仪器原理、设计方法和实现技巧,运用专业课程中的基本理论和实践知识,采用LabVIEW开发工具,实现汉诺塔的设计和仿真。要求通过本课程设计使学生熟悉LabVIEW开发环境,掌握基于LabVIEW的虚拟仪器设计原理、设计方法和实现技巧,使学生掌握通信系统设计和仿真工具,为毕业设计做准备,为将来的学习及今后从事科学研究、工程技术工作打下较坚实的基础。 本课程设计要求实现汉诺塔游戏的设计与仿真,即通过学习和了解labview 开发环境,并分析汉诺塔游戏原理,在通过labview开发工具设计与实现汉诺塔游戏。游戏规则主要是有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B 上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,点击柱子上的A、B、C按钮,柱子顶上的木块弹起,再点一下想放的位置,木块移至该柱子上。或者利用键盘上的上下左右光标键控制木块移动:先按“左”、“右”键移动光标到某柱子下,按“上”键,柱子顶上的木块弹起,再左右移动光标,按“下”键木块放下。点击还原按钮,可回到当前关卡的初始状态,点退出键结束游戏。 2 汉诺塔游戏原理 汉诺塔游戏在现实生活中对与智力的开发,逻辑思维的培养等都有很大的帮助。在这种情况下,对汉诺塔游戏的研究和制作、仿真是十分很重要。本文就对基于LabVIEW的汉诺塔游戏的设计与仿真做详细的说明。 本课程设计要求实现汉诺塔游戏的设计与仿真,即通过学习和了解labview 开发环境,并分析汉诺塔游戏原理,在通过labview开发工具设计与实现汉诺塔游戏。游戏规则主要是有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B 上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,点击柱子上的A、B、C按钮,柱子顶上的木块弹起,再点一下想放的位置,木块移至该柱子上。或者利用键盘上的上下左右光标键控制木块移动:先按“左”、“右”键移动光标

汉诺塔问题的求解程序

1.基于汉诺塔问题的求解程序,分别使用全局变量和局部变量来计算当塔中有 n个盘子时需要进行多少步的盘子移动次数(例如当塔中有5个盘子时,需要移动31次)。提示:当使用局部变量时,函数的原型可以为 long hanoi(int ,char,char,char),该函数的功能是完成hanoi塔的移动并返回其执行步数。 方法一:使用局部静态变量 #include long hanoi(int n,char one, char two, char three) /*该函数计算移动盘的步骤并返回移动步数 */ { static long int count=0; /* 定义静态局部变量count,用以计算总共移动他多少次 */ if(n==1) { printf("move %c--> %c\n",one, three); count++; } else { hanoi(n-1,one,three,two); printf("move %c--> %c\n",one, three); count++; hanoi(n-1,two,one,three); } return(count); } void main() { int m=0; long int steps; /*定义长整型变量step用来装载hanoi函数的返回值*/ printf("please input the number of diskes:"); scanf("%d",&m); printf("the steps are following:\n"); steps=hanoi(m,'A','B','C'); printf("They need %ld steps to move\n",steps); } 方法二:使用一般局部变量 #include long hanoi(int n,char one, char two, char three)

相关主题
相关文档
最新文档