对汉诺塔问题的研究

对汉诺塔问题的研究
对汉诺塔问题的研究

汉诺塔c++程序

void Hanoi(int platesCount, int from, int dest, int by) { if (platesCount==1) { printf( "Move the plate from %d to %d through %d" , from, dest, by); }else { Hanoi(platesCount -1, from, by, dest); Hanoi(1, from, dest, by); Hanoi(platesCount -1, by, dest, from); } } // Advance one step to solve Hanoi void HanoiDrawer::SolveNextStep() { int platesCount , source , destination , intermediate; if(listSavedState.size()==0) { this->Hanoi(this->iPlatesCount, HanoiDrawer::SOURCE , HanoiDrawer::DESTINATION, HanoiDrawer::INTERMEDIATE); } if(listSavedState.size() % 4 != 0 ) { return; } platesCount = listSavedState.front(); listSavedState.pop_front(); source = listSavedState.front(); listSavedState.pop_front(); destination = listSavedState.front(); listSavedState.pop_front(); intermediate = listSavedState.front(); listSavedState.pop_front();

用VB设计汉诺塔动画游戏

本栏目责任编辑:谢媛媛软件设计开发Computer Knowledge and Technology 电脑知识 与技术第5卷第30期(2009年10月)用VB 设计汉诺塔动画游戏 刘德强 (无锡职业技术学院,江苏无锡214024) 摘要:汉诺塔问题是程序设计教学中关于递归调用的经典案例。该文介绍了用VB 设计汉诺塔动画游戏程序的基本过程,其中重点介绍了用VB 的自定义数据类型和图形处理技术设计游戏步点状态记录和动画效果的方法。 关键词:VB ;汉诺塔;动画 中图分类号:TP311文献标识码:A 文章编号:1009-3044(2009)30-8460-03 The Designing of Hanoi Towers Animation Game by VB LIU De-qiang (Wuxi Institute of Technology,Wuxi 214024,China) Abstract:The Hanoi Towers is a typical case of recursive calls in programming teaching.This paper introduces the basic process of design -ing Hanoi Towers animation game by VB,focuses on recording game state between two steps and designing animation by self-defined data type and graph skill in VB. Key Words:VB;Hanoi;animation 汉诺塔问题源自印度的一个古老传说,传至现代演变成了汉诺塔游戏:有A 、B 、C 三个垂直杆和若干个大小各不相同的圆片。开始时圆片全部套在A 杆上,且从下至上圆片大小依次递减。要求借助B 杆,将圆片全部移到C 杆上,每次只能移动一片,并且整个过程中三个杆上的圆片都必须保持大的在下小的在上。游戏的难度由开始时放置在A 杆上圆片的个数进行控制。 1游戏步点状态记录设计 笔者设计的汉诺塔游戏程序主要包括演示和游戏两方面的功能。演示功能实现的是根据汉诺塔问题算法预先计算出的圆片移动顺序由计算机自行对圆片进行移动;而游戏功能是指计算机通过人机交互界面根据游戏者的实时操作顺序进行圆片的移动。图1是程序运行时界面。无论是演示还是游戏,计算机执行的基本动作元素是相同的,即圆片从一个杆上移动到另一个杆上,这一过程体现在程序设计中就是在新的位置对圆片图形进行重画,它与每个杆的步点状态密切相关。 步点状态是指每完成一步操作以后,开始下一步操作之前,一个杆上 的圆片数量及各圆片的位置和大小等多个特征综合构成的状态,是多个 数据的集合。将开始时圆片数记为n ,从初始状态圆片都在A 杆上,到终 止状态n 个圆片移到C 杆上,其间每次移动圆片,各杆的步点状态都会 发生变化。游戏进程中“记”住各杆的当前步点状态,是实现不断移动圆片 的关键。以要移动A 杆上的一个圆片到B 杆为例:要判断圆片根据规则 是否可以移动及圆片移动后放置在B 杆的什么位置(y 坐标),就必须知 道当前B 杆上最上端圆片的大小和B 杆上当前圆片数量,即B 杆的当前 步点状态。综合以上分析,游戏步点状态记录是程序设计中的要点。 鉴于描述步点状态需要多个数据,且数据间相互关联并构成整体,笔 者在设计中采用了自定义数据类型的方法,数据类型名称为circles ,所含 内容和定义格式如下: Type circles counts As integer r()As integer x As integer y()As integer End Type circles 类型中,数据成员counts 用于记录杆上实际圆片数,r 用于记录各圆片的半径,x 记录各圆片圆心的x 坐标,y 记录各圆片圆心的y 坐标。因为每次游戏设置的初始圆片数是不确定的且游戏进程中各杆都可能出现多个圆片,所以数据成员r 和y 定义为动态数组。 数据类型circles 定义以后,先使用该类型定义三个实例a 、b 、c ,分别代表A 、B 、C 三个杆的步点状态。语句如下: Dim a As circles ,b As circles ,c As circles 当初始圆片数量确定后(记为n),可使用下列语句对A 杆的步点状态a 进行初始化。 投稿日期:2009-08-22 作者简介:刘德强(1965-),江苏靖江人,无锡职业技术学院讲师。 图1运行界面ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.5,No.30,October 2009,pp.8460-8462E-mail:xsjl@https://www.360docs.net/doc/a11998021.html, https://www.360docs.net/doc/a11998021.html, Tel:+86-551-569096356909648460

汉诺塔 java 程序

汉诺塔java 程序 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class AutoMoveDisc extends JDialog implements ActionListener{ int amountOfDisc=3; TowerPoint [] pointA,pointB,pointC; char [] towerName; Container con; StringBuffer moveStep; JTextArea showStep; JButton bStart,bStop,bContinue,bClose; Timer time; int i=0,number=0; AutoMoveDisc(Container con){ setModal(true); setTitle("自动演示搬盘子过程"); this.con=con; moveStep=new StringBuffer(); time=new Timer(1000,this); time.setInitialDelay(10); showStep=new JTextArea(10,12); bStart=new JButton("演示"); bStop=new JButton("暂停"); bContinue=new JButton("继续"); bClose=new JButton("关闭"); bStart.addActionListener(this); bStop.addActionListener(this); bContinue.addActionListener(this); bClose.addActionListener(this); JPanel south=new JPanel(); south.setLayout(new FlowLayout()); south.add(bStart); south.add(bStop); south.add(bContinue); south.add(bClose); add(new JScrollPane(showStep),BorderLayout.CENTER); add(south,BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); towerName=new char[3]; addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ time.stop(); setVisible(false);

汉诺塔游戏设计过程

兰州交通大学 数理与软件工程学院 课程设计报告 2011 ~2012学年第二学期 课程名称数据结构 设计题目汉诺塔游戏程序 班级信计1001班 小组成员张章、王欣、李贵生 报告者李贵生201005235 指导老师金静 2012年6月

一、实验目的: 通过此次C++实训,一方面加深了对C++语言的了解,而不只是单单的在课本中学到的那些理论。通过学生动手亲自编写,平时乏味的课程,变的生动有趣。平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。另一方面,通过学生小组完成任务,提高团队意识,增加凝聚力,让同学们意识到团结就是力量,每个人都是重要的一份子。 二、题目:汉诺塔游戏程序 <1> 问题描述:在平面上有三个位置A、B、C,在A位置上有n 个大小不等的圆盘、小盘压在大盘上形成圆盘堆。要求将A位置的N个圆盘通过B位置移动到C位置上,并按同样的顺序叠放。 移动圆盘时必须遵循以下规则: 1.每一次只能移动一个圆盘 2.圆盘可以放在A、B、C任何一个塔座上 3.任何时刻都不能将大圆盘压在小圆盘上 <2> 基本要求: 圆盘的个数从键盘输入(如3-64等);用动画的形式在屏幕上显示盘的移动。 三、问题分析和任务定义 1、已知有三个塔(1、 2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。 2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆

放至顶部)。 3、每次移动一个碟子。 4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。 5、可以借助塔3。 先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了: 1、将上面的N个盘子移到b杆上; 2、将a杆上剩下的盘子移到c杆上; 3、将b杆上的全部盘子移到c杆上。 将这个过程继续下去,就是要先完成移动n个盘子、n-1个盘子、n-2个盘子....1个盘的工作。 四、课题介绍: 4.1 汉诺塔问题初始模型: 4.2 实现步骤: 为满足题目中盘子的移动问题,必须遵循的条件是:一次

汉诺塔问题与递归思想教学设计

一、教学思想(包括教学背景、教学目标) 1、教学背景 本课程“递归算法”,属于《数据结构与算法》课程中“栈和队列”章节的重点和难点。数据结构与算法已经广泛应用于各行各业的数据存储和信息处理中,与人们的社会生活密不可分。该课程是计算机类相关专业核心骨干课程,处于计算机学科的核心地位,具有承上启下的作用。不仅成为全国高校计算机类硕士研究生入学的统考科目,还是各企业招聘信息类员工入职笔试的必考科目。数据结构与算法课程面向计算机科学与技术、软件工程等计算机类学生,属于专业基础课。 2、教学大纲 通过本课程的学习,主要培养学生以下几个方面的能力: 1)理解递归的算法; 2)掌握递归算法的实现要素; 3)掌握数值与非数值型递归的实现方法。 根据学生在学习基础和能力方面的差异性,将整个课程教学目标分成三个水平:合格水平(符合课标的最低要求),中等以上水平(符合课标的基本要求),优秀水平(符合或超出课标提出的最高要求)。具体如下表:

二、课程设计思路(包括教学方法、手段) “递归算法”课程以故事引入、案例驱动法、示范模仿、启发式等多元化教学方法,设计课程内容。具体的课堂内容如下所示:

1 1 2 3 3 7 4 15 5 31 count = 2n-1 思考:若移动速度为1个/秒,则需要 (264-1)/365/24/3600 >= 5849亿年。 四、总结和思考 总结: 对于阶乘这类数值型问题,可以表达成数学公式,然后从相应的公式入手推导,解决这类问题的递归定义,同时确定这个问题的边界条件,找到结束递归的条件。 对于汉诺塔这类非数值型问题,虽然很难找到数学公式表达,但可将问题进行分解,问题规模逐渐缩小,直至最小规模有直接解。 思考: 数值型问题:斐波那契数列的递归设计。 非数值型问题:八皇后问题的递归设计。阐述总结知识拓展 三、教学特色(总结教学特色和效果) 递归算法课程主要讨论递归设计的思想和实现。从阶乘实例入手,由浅入深,层层深入介绍了递归的设计要点和算法的实现。从汉诺塔问题,通过“边提问,边思考”的方式逐层深入地给出算法的分析和设计过程。通过故事引入、案例导入、实例演示、PPT展示、实现效果等“多元化教学方式”,努力扩展课堂教学主战场。加上逐步引导、问题驱动,启发学生对算法的理解,并用实例演示展示算法的分析过程,在编译环境下实现该算法,加深对算法实现过程的认识。 1、知识点的引入使用故事诱导法讲授 通过“老和尚讲故事”引入函数的递归调用,并通过“世界末日问题” 故事引入非数值型问题的递归分析,激发学习积极性,挖掘学生潜能。

汉诺塔程序实验报告

实验题目: 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 ;

汉诺塔探趣

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

汉诺塔程序解读

hanoi塔程序如下: main() {hanoi(3,'A','B','C'); } hanoi(n,a,b,c) int n; char a,b,c; {if (n==1) printf("%c-->%c\n",a,c); else {hanoi (n-1,a,c,b); printf ("%c-->%c\n",a,c); hanoi (n-1,b,a,c);} } 运行结果: A-->C A-->B C-->B A-->C B-->A B-->C A-->C 问题: hanoi(n,a,b,c) int n; char a,b,c; {if (n==1) printf("%c-->%c\n",a,c); else {hanoi (n-1,a,c,b); printf ("%c-->%c\n",a,c); hanoi (n-1,b,a,c);} } 我给你详细解释下这个程序中的代码吧。我也是刚学,希望对你有用。可能有些不好之处,还希望谅解。 先说下这个问题的整体思想: 1,如果只有1个盘,那么就直接把这个盘从A移动到C上。

2,如果存在两个盘,那么先把第一个盘移动到B上,在把最下面一个盘移动到C上,在把B上的盘移动到C上。 3,这样,我们可以得出一个结论,如果存在N个盘,可以先把上面N-1个盘通过C 移动到B上,然后把第N个盘移动到C上,再把B上的N个盘通过A 移动到C上。 if (n==1) printf("%c-->%c\n",a,c); 这一句,表示只有1个盘子的时候,那么就是把第一个盘子直接移到第三个盘子上。 else {hanoi (n-1,a,c,b); 如果超过一个盘字,则需要先把N-1个盘子通过C 移动到B上。 printf ("%c-->%c\n",a,c); 把剩下的第N个盘,从A移动到C上。 hanoi (n-1,b,a,c);} 再把剩下的在B上的N-1个盘,通过A移动到C上。 这属于一个递归算法。 现在,N=3。 我们看下程序怎么运行的。 else {hanoi (n-1,a,c,b); printf ("%c-->%c\n",a,c); hanoi (n-1,b,a,c);} N=3,也就是开始程序会执行 hanoi (2,a,c,b);这句语句。 再看,2还是大于1,所以 程序会继续运行。注意,这里,为hanoi (2,a,c,b); C和B 换了位置。 hanoi (2,a,c,b); 我们把数字代入,得出。 根据N=2,C和B 互换。以及下面的代码,得出 ````````````````````````````````````````````````

汉诺塔问题

XXXX大学信息学院 课程设计报告 教师签名:xxxxx

题目1实验报告 1.数据结构定义 因为该算法需要用到循环队列、堆和线性表,因此采用以下数据类型: typedef struct { QElemType *base; // 初始化的动态分配存储空间 int front; // 头指针,若队列不空,指向队列头元素 int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue;//循环队列 typedef struct { int *elem; int length; int listsize; }SqList;//堆排序 2.算法说明 void HeapAdjust(int flag,SqList &H,int s,int m) void HeapSort(int flag,SqList &H)//对H进行堆排序; Status InitQueue(SqQueue &Q)//构造一个空队列Q,该队列预定义大小为MAXQSIZE; Status EnQueue(SqQueue &Q,QElemType e) //插入元素e为Q的新的队尾元素; Status DeQueue(SqQueue &Q, QElemType &e) // 若队列不空, 则删除Q的队头元素, 用e 返回其值, 并返回OK; 否则返回ERROR; Status GetHead(SqQueue Q, QElemType &e)// 若队列不空,则用e返回队头元素,并返回OK,否则返回ERROR; Status QueueLength(SqQueue Q) // 返回Q的元素个数; Status QueueTraverse(SqQueue Q)// 若队列不空,则从队头到队尾依次输出各个队列元素,并返回OK;否则返回ERROR. 3.用户使用说明 运行程序,根据屏幕上的文字提示一步步操作。 4.个人测试结果(截图) 部分测试结果截图

C#汉诺塔演示和代码

汉诺塔的演示界面: 本系统显示的是汉诺塔的演示效果,分别有播放,暂停,和停止,右边显示的是每一步的动作,同时记录操作次数,可以调节演示的速度。 汉诺塔界面代码: namespace honio4 { partial class Form1 { ///

/// 必需的设计器变量。 /// https://www.360docs.net/doc/a11998021.html,ponentModel.IContainer components = null; /// /// 清理所有正在使用的资源。 /// /// 如果应释放托管资源,为true;否则为false。 protected override void Dispose(bool disposing) { if (disposing && (components != null)) {

components.Dispose(); } base.Dispose(disposing); } #region Windows 窗体设计器生成的代码 ///

/// 设计器支持所需的方法- 不要 /// 使用代码编辑器修改此方法的内容。 /// private void InitializeComponent() { https://www.360docs.net/doc/a11998021.html,ponents = new https://www.360docs.net/doc/a11998021.html,ponentModel.Container(); this.panel1 = new System.Windows.Forms.Panel(); this.panel2 = new System.Windows.Forms.Panel(); this.panel3 = new System.Windows.Forms.Panel(); https://www.360docs.net/doc/a11998021.html,bel1 = new https://www.360docs.net/doc/a11998021.html,bel(); this.udLevels = new System.Windows.Forms.NumericUpDown(); this.btnStart = new System.Windows.Forms.Button(); this.btnPause = new System.Windows.Forms.Button(); this.btnStop = new System.Windows.Forms.Button(); https://www.360docs.net/doc/a11998021.html,bel2 = new https://www.360docs.net/doc/a11998021.html,bel(); this.trackSpeed = new System.Windows.Forms.TrackBar(); https://www.360docs.net/doc/a11998021.html,bel3 = new https://www.360docs.net/doc/a11998021.html,bel(); this.progress = new System.Windows.Forms.ProgressBar(); this.tmrPlay = new System.Windows.Forms.Timer(https://www.360docs.net/doc/a11998021.html,ponents); this.listBox1 = new System.Windows.Forms.ListBox(); https://www.360docs.net/doc/a11998021.html,bel4 = new https://www.360docs.net/doc/a11998021.html,bel(); https://www.360docs.net/doc/a11998021.html,bel5 = new https://www.360docs.net/doc/a11998021.html,bel(); https://www.360docs.net/doc/a11998021.html,bel6 = new https://www.360docs.net/doc/a11998021.html,bel(); https://www.360docs.net/doc/a11998021.html,bel7 = new https://www.360docs.net/doc/a11998021.html,bel(); https://www.360docs.net/doc/a11998021.html,bel8 = new https://www.360docs.net/doc/a11998021.html,bel(); ((https://www.360docs.net/doc/a11998021.html,ponentModel.ISupportInitialize)(this.udLevels)).BeginInit(); ((https://www.360docs.net/doc/a11998021.html,ponentModel.ISupportInitialize)(this.trackSpeed)).BeginInit(); this.SuspendLayout(); // // panel1 // this.panel1.Location = new System.Drawing.Point(16, 16); https://www.360docs.net/doc/a11998021.html, = "panel1"; this.panel1.Size = new System.Drawing.Size(96, 144); this.panel1.TabIndex = 7; this.panel1.Paint += new

汉诺塔演示

汉诺塔演示 课程设计报告 姓名学号分工 胡楠楠201212201401027组长统筹规划梅清晨201212201401009报告、部分代码刘安妮201212201401029报告、部分代码孙坡坡201212201402010PPT演示

目录 一、问题描述.................................................................................................................................. II 二、任务概述.................................................................................................................................. II 2.1课程设计的目的............................................................................................................... II 2.2课程设计的内容和要求................................................................................................... II 2.2.1功能要求.............................................................................................................. II 2.2.2环境要求............................................................................................................. I II 2.2.3课程设计设备..................................................................................................... I II 三、问题分析:............................................................................................................................. I II 四、设计思路.................................................................................................................................. V 4.1主程序流程图................................................................................................................... V 4.2功能模块示意图.............................................................................................................. V I 4.3汉诺塔求解流程图.......................................................................................................... V I 五、模块详细说明....................................................................................................................... VII 5.1背景初始化.................................................................................................................... VII 5.1.1开启DOS图形模式......................................................................................... VII 5.1.2字幕显示模块...................................................................................................... VII 5.2问题求解模块................................................................................................................... I X 5.2.1汉诺塔问题描述.................................................................................................... I X 5.2.2移动方案................................................................................................................. X 5.2.3演示动画................................................................................................................. X 5.2.4屏幕暂停函数........................................................................ 错误!未定义书签。 5.2.5路径清理模块...................................................................................................... XII 六、用户运行界面图示............................................................................................................... XII 七、心得体会........................................................................................................................ X VI

汉诺塔模拟程序报告

合肥学院 计算机科学与技术系 课程设计报告 2010~2011学年第一学期 课程 JAVA语言课程设计 课程设计名称汉诺塔模拟程序 学生姓名程伟 学号0704031021 专业班级网络工程(1)班 指导教师许强、张贯虹 2010年9月 1、 需求分析 本次的课程设计的主要任务是:设计一个模拟程序,图形化地展现汉诺塔的求解过程。主要解决的问题是: 1. 学习数据结构课程中关于汉诺塔的知识和算法。 N阶Hanoi塔,有3个柱子a、b、c,a柱子上从上至下叠放有n个直径由小到大、编号依次为1,2,…,n的圆盘。现要求将a柱上的n个圆盘移至c柱,并仍按同样顺序叠放。圆盘移动时须遵循以下原则: 1) 每次只能移动一个圆盘。 2) 圆盘可以插在a、b、c中的任何一个柱子上。

3) 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 圆盘的移动过程是一个递归调用过程。 2. 设计图形界面,画出3个柱子和若干个大小不一的圆盘,圆盘数量可人工设定。 Frame是一种具有边框的容器,它是Java中最常用的容器之一,它又是Java Application程序的图形用户界面。Frame只能作为最外层容器,不能被任何其他容器所包含。下拉列表是一种“多选一”的输入界面,通常只可看见下拉列表的一个选项和它右边的箭头按钮。当要改变盘子的个数时(即单击下拉列表中选中项),系统自动产生一个ItemEvent类对象所包含这个时间的信息,并将该对象作为实参传递给被自动调用的监听者的选择事件的响应方法。 3. 当点击“开始”按钮后,系统自动展现圆盘的移动过程,一秒移动一次。 线程是进程中一段连续的控制流程或是一段执行路径。在Java语言中,线程的创建有两种方式:(1)定义一个Thread类的子类,并在该子类中重写run()方法,该run()方法是线程执行的起点;(2)定义一个实现Runnable接口的类,并在该类中定义Runnable接口的run()方法,同样,该run()方法代表了线程执行的起点。本程序中用到第二种创建线程的方法。 2、 设计 .1 设计思想 本程序要求实现用图形界面,画出3个柱子和若干个大小不一的圆盘,同时圆盘数目可以人工设定,当点击“开始”按钮后,系统自动展现圆盘的移动过程,从而实现汉诺塔问题,其中圆盘移动速度是每秒移动一次。 1、 所谓汉诺塔,既是一种游戏,游戏的装置是一块铜板,上面有3根 杆,最左 杆自下而上、由大到小顺序串有64个金盘,呈一个塔形(如图1.1所示)。游戏要求把左边杆上的金盘全部移动到最右

汉诺塔的非递归(演示动画).

汉诺塔的非递归(演示、动画) Hanoi,非递归,演示,动画效果 kensta 有动画演示,move2()是标准解的调用 move()是用于演示动画或显示移动秩序和包含监测有无错误移动的调用 使用Borland c++ 3.0(Turbo c++ 3.0,Turbo c 2.0也可)编译通过,图形方式使用Tc 的bgi */ /*************************************/ /* about error process */ #include #include #include /* if debuging use #define ERROR_DEBUG otherwise remove it. */ //#define ERROR_DEBUG

#ifdef ERROR_DEBUG #define error(x) error_debug(x) #define report() report_debug() #define initerror() initerror_debug() char *err[10]; int errs=0; void initerror_debug(){ int i; for(i=0;i<10;i++)err[i]=NULL; } void error_debug(char *a){ if(errs>9)return; err[errs]=(char *)malloc(strlen(a)+1); strcpy(err[errs],a); printf(a); errs++; } void report_debug(){ int i; if(!errs)return; for(i=0;i

梵塔动画演示的设计与实现【开题报告】

毕业设计开题报告 计算机科学与技术 梵塔动画演示的设计与实现 一、选题的背景、意义 动画演示历史背景: 早在1831年,法国人约瑟夫·安东尼·普拉特奥(Joseph Antoine Plateau)在一个可以转动的圆盘上按照顺序画了一些图片。当圆盘在机器的带动下旋转时,圆盘上的图片似乎动了起来,可称得上最原始的动画。 1906年,美国人户斯泰瓦德(J·StCWard )制作了一部名叫“ 滑稽面孔的幽默形象(Houmoious Phases of a Funny Face)” 的短片,这部短片非常接近现代动画概念。 1908年,法国人Endle Cohl首创用负片制作动画影片。所谓负片,是影像色彩与实际色彩恰好相反的胶片,如同今天的普通胶卷底片。采用负片制作动画,从概念上解决了影片载体的问题,为今后动画片的发展奠定了基础。 1909 年,美国人Winsor McCay 用一万张图片表现一段动画故事,这是迄今为止世界上认的第一部真正的动画短片。 1915 年,美国人Eerl Hurd 创造了新的动画制作工艺。他先在赛珞璐片上画动画片,然后再把赛珞璐片上的图片拍摄成动画影片,这种动画片的制作工艺一直沿用至今。 1928 年开始,世人皆知的华特·迪斯尼(Walt Disne)逐渐把动画影片的制作推向颠峰。他在完善了动画体系和制作工艺的同时,把动画片的制作与商业价值联系了起来,被人们誉为商业动画影片之父。华特·迪斯尼带领着他的一班人马为世人创造出无以伦比的大量动画精品。例如,米老鼠和唐老鸭、木偶奇遇记和白雪公主等。直到今天,华特·迪斯尼创办的迪斯尼公司还在为全世界的人们创造出丰富多样的动画片。 动画的发展经过了一个漫长的历程,从最初的动画雏形到现在的大型豪华动画片,其本质没有太大的变化,而动画制作手段却发生着日新月异地变化。今天,“电脑动画”、“电脑动画特技效果”不绝于耳,可见电脑对动画制作领域的强烈震撼。 传统动画片的生产过程主要包括如下的几方面: 一、脚本及动画设计:脚本是叙述一个故事的文字提要及详细的文学剧本,根据该剧本要设计出反映动画片大致概貌的各个片断,也即分镜头剧本。然后,对动画片中出现的各种角色的造型、动作、色彩等进行设计,并根据分镜头剧本将场景的前景和背景统一考虑,设计出手稿图及相应的对话和声音。

汉诺塔问题C语言程序设计

三峡大学理学院2011级电信专业 《高级语言程序设计》课程设计 说明书 设计题目: 汉诺塔的搬移过程设计 班级:高级语言程序设计1 班 学号:2011142227 姓名:徐飞 完成日期:2012 年6月20日 1设计任务 设计题目:用递归法计算解决汉诺塔问题,并能够演示解决汉诺塔问题过; 要求:设计一个运用递归法计算解决汉诺塔问题C语言程序; 2 汉诺(Hanoi)塔问题的提出 古代有一个梵塔,塔内有A,B,C,3个座,座A上有64个大小不等的盘子,大的在下,小的在上(如下图)。有一个和尚想把这64个盘子从座A全部移到座C ,在移动过程中可以借用座A,座B或座C,但每次只允许移动一个盘子,并且不允许大盘放在小盘的上面。 3编程思路 首先,要找出递归的两个关键点,即: 递归终止条件:只有一个盘子时,可以移动。 递归表达式:要找出递归表达式,可以如下设想:

下面以3个盘子为例说明详细的移动过程: (1)将座A上的2个盘子移动到座B上; (2)将座A上的1个盘子移动到座C上; (3)将座B上的2个盘子移动到座C上; 上面第1步可用递归方法分解为: (1)将座A上的1个盘子从座A移动到座C上;

(2)将座A上的1个盘子从座A移动到座B上; (3)将座C上的1个盘子从座C移动到座B上; 第(3)步可用递归方法分解为: (1)将座B上的1个盘子从座B移动到座A上; (2)将座B上的1个盘子从座B移动到座C上; (3)将座B上的1个盘子从座A移动到座C上; 第(1)步操作可归纳为:将座A上的2个盘子借助座C移到座B; 第(3)步操作可归纳为:将座B上的2个盘子借助座A移到座C; 因此,将n个盘子从座A移到座C可以描述为: (1)将n-1个盘子从座A借助座C移到座B; (2)将剩下的一个盘子从座A移到座C; (3)将n-1个盘子从座B借助座A移到座C; 3系统操作流程图; 4.程序说明;

相关文档
最新文档