汉诺塔程序设计报告
汉诺塔课程设计
汉诺塔课程设计
一、教学内容:
1、了解汉诺塔的历史。
2、讲解汉诺塔的游戏规则。
二、课程设计目的:
1、让伙伴们了解汉诺塔的历史,勾起孩子们的学习兴趣,让伙伴们更加热爱数学。
2、在掌握汉诺塔玩法的基础上,锻炼伙伴们的观察力,变通里,和右脑开发。
3、增强伙伴们的空间想象能力和动手能力。
4、让伙伴们体会到数学的神奇,从而对数学产生更加浓厚的兴趣。
三、培养技能:观察力、想象力、变通里、右脑开发。
四、所需工具:汉诺塔、记号笔。
五、教学流程概述:
第一节课:1、讲一个关于汉诺塔的故事。2、带领伙伴们一起观察和了解汉诺塔的游戏规则。(以三盘为例说明)(30分钟)
第二节课:汉诺塔4盘的移法。(30分钟)
第三节课:汉诺塔5盘的移法。(30分钟)
第四节课: 汉诺塔月底考核。(30分钟)
六、教学流程详细解读:
第一节课:让伙伴们了解汉诺塔的历史,勾起孩子们的学习
兴趣,让伙伴们更加热爱数学。
1、讲关于汉诺塔的故事:
在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄
铜板上插着三根宝石针。印度教的主神梵天在创造世界的时
候,在其中一根针上从下到上地穿好了由大到小的64片金
片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在
按照下面的法则移动这些金片:一次只移动一片,不管在哪
根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移
2、告诉伙伴们游戏规则:
以三个环为例说明:
(一)先让伙伴们自己观察有几个柱子,有几个盘,并且盘是怎么排列的?
答:有三根相邻的柱子,第一根柱子上从下到上放着3个不同大小的圆盘,并且顺序是由大到小依次叠放。
汉诺塔程序实验报告
汉诺塔程序实验报告
竭诚为您提供优质文档/双击可除汉诺塔程序实验报告
篇一:汉诺塔程序实验报告
实验题目:
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个圆盘从塔座x移动到塔座A;
1.2"将塔座b上1个圆盘从塔座x移动到塔座c;
1.3"将塔座A上1个圆盘从塔座Z移动到塔座c。
第3步可以分解为:
3.1将塔座c上1个圆盘从塔座Y移动到塔座b;
3.2将塔座c上1个圆盘从塔座Y移动到塔座A;
3.3将塔座b上1个圆盘从塔座x移动到塔座A。
综上所述:可得到移动3个圆盘的步骤为
b->A,b->c,A->c,b->A,c->b,c->A,b->A,
C语言程序设计课程设计报告---汉诺塔问题
XXXX大学
计算机科学与技术学院
课程设计报告
2012 — 2013学年第一学期
课程名称C/C++高级语言程序设计课程设计设计题目小游戏和图形处理
汉诺塔问题
学生姓名XXX
学号XXXXXXX
专业班级XXXXXXXXXXX
指导教师XX
2012 年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个盘子从一个座移到另一个座,那么问题就解决了,此时僧人
汉诺塔实验报告
汉诺塔实验报告
汉诺塔实验报告
引言:
汉诺塔是一种经典的数学谜题,它激发了人们对逻辑思维和解决问题的热情。本次实验旨在通过模拟汉诺塔游戏,探究其背后的数学原理和解决方法,并分析实验结果。
实验目的:
1. 理解汉诺塔问题的规则和目标。
2. 掌握汉诺塔问题的解决方法。
3. 分析实验结果,总结汉诺塔问题的数学特性。
实验过程:
首先,我们需要了解汉诺塔的规则。汉诺塔由三个柱子组成,分别命名为A、B 和C。开始时,所有的盘子都放在柱子A上,且按照从小到大的顺序叠放。目标是将所有的盘子从柱子A移动到柱子C上,期间可以利用柱子B作为辅助。接下来,我们使用计算机程序模拟汉诺塔游戏。通过编写算法,我们可以实现自动化的盘子移动过程。我们设定盘子的数量为n,初始时所有盘子都在柱子A上。通过递归算法,我们可以将柱子A上的n个盘子移动到柱子C上。
实验结果:
我们进行了多次实验,分别模拟了不同数量的盘子移动过程。通过观察实验结果,我们可以得出以下结论:
1. 移动次数:根据经验公式2^n-1,我们可以计算出移动n个盘子所需的最小步数。实验结果验证了这一公式的正确性,进一步证明了汉诺塔问题的数学特
性。
2. 时间复杂度:随着盘子数量的增加,移动所需的时间也呈指数级增长。这是因为递归算法的时间复杂度为O(2^n),需要大量的运算时间。
3. 解决方法:我们发现,无论盘子数量多少,解决汉诺塔问题的方法都是相同的。通过将问题分解为更小规模的子问题,我们可以逐步移动盘子,最终达到目标。
4. 空间复杂度:在我们的模拟实验中,我们使用了计算机程序来模拟汉诺塔游戏。这意味着我们不需要实际的物理空间来放置盘子,大大降低了实验的难度和成本。
汉诺塔实验报告
汉诺塔实验报告
2012 年 12 月 21 日
目录
1、概
述 ................................................................ 错误~未定义书签。4
2、实验目的 ........................................................ 错误~未定义书签。4
3、问题分
析 ..................................................................... ...................... 2 4、实验步
骤 ........................................................ 错误~未定义书签。5
5、流程
图 ..................................................................... .......................... 3 6、程序代
码: .................................................................... ................... 4 7、程序调试与测
试 ..................................................................... .......... 8 8、结
Java课程设计报告--Hannoi塔
课程设计报告
课程名称 Java程序设计
课题名称 Hannoi塔
专业计算机科学与技术
班级
学号
姓名
指导教师李远辉
2013 年 6月 27日
湖南工程学院
课程设计任务书
课程名称 Java程序设计
课题 Hannoi塔
专业班级
学生姓名
学号
指导老师李远辉
审批李远辉
任务书下达日期 2013 年 6 月20 日
任务完成日期2013 年 6 月 27 日
目录
1.设计要求 (1)
1.1 界面要求 (1)
1.2 功能要求 (1)
2.总体设计 (2)
2.1 总体概述 (2)
2.2 主要类功能设计 (3)
3.详细设计 (5)
3.1 HannoiWindow类 (5)
3.2 Tower类 (5)
3.3 HandleMouse类 (6)
3.4 AutoMoveDisc类 (7)
3.5 TimeCount类 (8)
4.调试与结果分析 (9)
4.1 初级游戏 (9)
4.2 游戏界面属性设置 (10)
4.3 游戏外观设置 (10)
4.4 自动移动演示 (10)
5.设计总结与心得体会 (12)
附录 (13)
1 参考书 (13)
2 源代码 (13)
1 设计要求
1.1 界面要求
用户界面为GUI界面,其分为菜单栏以及游戏区两个部分。游戏区中分布有三座Hannoi塔,其名字分别为A、B、C。初始状态下A座有三个大小不等的盘子,其按照从大到小的顺序依次摆放在A座上。
1.2 功能要求
1.2.1 游戏规则
用户用鼠标选中盘子,然后通过拖动鼠标来移动盘子、释放鼠标来放置该盘子。其中主要的规则就是:
(1)移动盘子时,盘子上方必须无盘子
(2)放置盘子时,其位置必须在塔点处,而且盘子必须比下方盘子小
汉诺塔程序设计报告
数据结构
学院:信息学院
班级:计科高职13-2姓名:曲承玉
学号:4044
汉诺塔程序设计报告
一、题目
汉诺塔(Towers of Hanoi)问题
二、设计要求
1、在窗口中画出初始时塔和碟子的状态。
2、可以以自动或手动两种方式搬移碟子。
3、自动搬移可以通过定时器或多线程的方法,每一次移动的时间间隔可以自定,以人眼观察比较舒服为宜,每一次的移动过程如能实现动画最好。
4、定义塔的描述类和碟子的描述类。
5、在程序中,碟子的数目及每次移动的时间间隔可以通过对话框设置(也应该有默认值)。
6、支持暂停功和继续的功能(在自动搬移过程中可以暂停,并继续)。
7、暂停后,可以将当前的状态保存(碟子和塔的组合关系)。
8、可以从7中保存的文件中读出某个状态,并继续移动。
三、问题分析
1、已知有三个塔(1、
2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。
2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆放至顶部)。
3、每次移动一个碟子。
4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。
5、可以借助塔3。(图1-1)
图1-1
首先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了:
1、将上面的63个盘子移到b杆上;
2、将a杆上剩下的盘子移到c杆上;
3、将b杆上的全部盘子移到c杆上。
将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子....1个盘的工作。
四、算法选择
汉诺塔程序设计算法的实质就是递归递归思想的运用。现将其算法简述如下:
为了更清楚地描述算法,可以定义一个函数hanoi(n,a,b,c)。该函数的功能是:将n个盘子从塔a上借助塔b移动到塔c上。这样移动n个盘子的工作就可以按照以下过程进行:
汉诺塔实验报告
汉诺塔实验报告
实验目的:
1. 了解汉诺塔问题的基本原理和规则;
2. 探究汉诺塔问题的解法方法;
3. 实现汉诺塔问题的自动解决。
实验器材:
1. 汉诺塔游戏盘;
2. 三个铁柱子;
3. 若干大小不同的木块。
实验步骤:
1. 将汉诺塔游戏盘放在桌子上,将三个铁柱子按照规定放好;
2. 将木块按照大小顺序放在游戏盘上的一个铁柱子上;
3. 学习汉诺塔的规则:第一,每次只能移动一个木块;第二,
大的木块不能在小的木块上面;
4. 准备按照规则玩一次汉诺塔游戏并记录操作步骤;
5. 研究汉诺塔问题的解法方法,探究能否有更高效的解法;
6. 利用编程语言,自编程序实现汉诺塔问题的解决;
实验结果:
通过汉诺塔游戏的实践操作,学生们掌握了汉诺塔问题的基本
原理和规则,学习了汉诺塔问题的解法方法,能够熟练操作解决
汉诺塔问题。
在编制汉诺塔问题的解决程序时,学生们运用了自己的思维和
编程技能,实现了木块的自动移动,大大提高了解决问题的效率。
结论:
汉诺塔问题是一种经典的数学问题,通过实验,我们对汉诺塔
问题有了更为深刻的理解。实验得到的结果表明,通过编程语言
自编程序能够更为高效地解决问题,这为我们今后学习科学知识提供了很好的借鉴意义。
Hannoi塔(汉诺塔)--Java课程设计报告
Java课程设计报告
题目汉诺塔
所在院系软件学院
学生姓名邓小文专业土木+软件工程班级08-1班学号14号
2010年7月17日
一、总体设计
1.本系统的主要功能(1)本软件是汉诺塔游戏;(2)可以实现计时功能;(3)游戏结束时记录排名;
(4)在玩游戏的同时还可以欣赏歌曲;(5)不知如何玩时可以实现自动演示;
2.系统包含的类及类之间的关系
为了实现本软件的各项功能,对要在本软件中需要用到的源文件进行总体设计。本系统共包括12个java 源文件。1.各个类之间的关系如图1所示。
Hel Tower
HannoiTower Musi Disk TowerPoint Time
Record ShowRecor Peopl
图1-1各个类之间的关系
2.java 源文件及其功能,如表所示。
表1java 源文件及其功能
二、详细设计
为了实现总体设计中的各个类之间的接口连接,使玩家能够顺畅的使用本软件进行游戏,考虑用详细设计来给玩家一一介绍。
以下是对本软件的详细设计:
序号文件名主要功能备注
1
Tower 用户可以在主窗口选择开始搬运
盘子或自动演示。程序默认的情况
是手动搬运盘子
2HannoiTower 该文件生成的类负责创建Hannoi
塔,汉诺塔由A、B、C 三个塔组成,
可以用鼠标搬运各个塔上的盘子。3Disk
该文件生成的类负责创建盘子对
象
4
TowerPoint 该文件生成的类负责为Hannoi 塔
创建塔点对象,即盘子放置的位
置。
5Time 记录玩家完成游戏所需的时间
6People 记录成绩能够排进排行榜的选手7About 关与本软件的制作信息8Help 帮助主题9Record 记录
汉诺塔实验报告
计算机学院
实验报告
课程名称:数据结构
实验名称:汉诺塔
学生姓名:朱孝彬
学生学号:20110511001
实验日期:2012
一、实验目的
1.理解数据结构中汉诺塔
2.掌握汉诺塔的C++描述。
二、实验内容
1.编制汉诺塔的程序。
三、实验步骤
1.需求分析
本演示程序用C++6.0编写,完成汉诺塔的生成,
2.概要设计
1)为了实现上述程序功能,需要定义单链表的抽象数据类型:
(1)insert
初始化状态:单链表可以不为空集;操作结果:插入一个空的单链表L。
(2)decelt
操作结果:删除已有的单链表的某些结点。
(3)display
操作结果:将上述输入的元素进行排列显示。
(4)modify
操作结果:将上述输入的某些元素进行修改。
(5)save
操作结果:对上述所有元素进行保存。
(6)load
操作结果:对上述元素进行重新装载。
3.使用说明
程序执行后显示
======================
1.单链表的创建
2.单链表的显示
3.单链表的长度
4.取第i个位置的元素
5.修改第i个位置的元素
6.插入元素到单链表里
7.删除单链表里的元素
8.合并两个单链表
9.退出系统
=======================
6.测试结果
四、实验总结(结果分析和体会)
单链表的最后一个元素的next为null ,所以,一旦遍历到末尾结点就不能再重新开始;而循环链表的最后一个元素的next为第一个元素地址,可返回头结点进行重新遍历和查找。
c语言程序汉诺塔优秀教学设计 -回复
c语言程序汉诺塔优秀教学设计-回复
C语言程序汉诺塔优秀教学设计
引言:
汉诺塔是一个经典的数学谜题,也是计算机科学中的经典算法之一。通过教学学生编写C语言程序实现汉诺塔问题,可以锻炼学生的逻辑思维能力、编程能力和解决问题的能力。本文将提供一套优秀的教学设计,一步一步引导学生完成汉诺塔程序的编写。
一、理解汉诺塔问题
首先,我们需要向学生介绍汉诺塔问题的背景和规则。给定三个柱子A、B和C,其中柱子A上有多个大小不等的圆盘,我们的目标是将所有的圆盘从A柱子上移动到C柱子上,并且保证移动过程中大圆盘不会放在小圆盘上。
二、解答汉诺塔问题的思路
1. 观察问题
首先,我们可以让学生观察当圆盘数量为1、2、3的时候,问题的解决方法,以帮助他们理解问题规律。
2. 分解问题
然后,我们引导学生发现,并分解出一个子问题:如何将n-1个圆盘从A
柱子通过B柱子移动到C柱子。这一步是解决该问题的关键,也是递归思想的应用。
3. 递归思想
我们通过递归思想解决子问题:将n-1个圆盘从A柱子通过B柱子移动到C柱子。递归的停止条件是当圆盘数量为1时,直接将其从A柱子移动到C柱子。
4. 移动圆盘
接下来是具体的移动圆盘的操作。我们可以定义一个函数move(),通过将圆盘从一个柱子移动到另一个柱子来实现。该函数应该接受三个参数:源柱子、目标柱子和经由的柱子。我们通过调用该函数来实现圆盘的移动。
三、实现C语言汉诺塔程序
在介绍完解题思路后,我们引导学生一步一步实现C语言的汉诺塔程序。
1. 定义函数move()
首先,我们可以引导学生定义一个函数move(),该函数接受三个参数:源柱子、目标柱子和经由的柱子。例如,函数定义可以如下所示:
河内塔实验报告
河内塔实验报告
河内塔,又称汉诺塔,是一个经典的数学谜题,它由法国数学家爱德华·卢卡
斯在1883年发现并首次提出。这个谜题由三根柱子和若干个不同大小的圆盘组成,开始时所有圆盘都按照大小顺序叠在柱子A上。游戏的目标是将所有圆盘从柱子
A移动到柱子C上,并且在移动过程中始终保持较小的圆盘在较大的圆盘上面。
在移动的过程中可以借助柱子B作为中转站,但是每次只能移动一个圆盘,并且
大圆盘不能放在小圆盘上面。
在这次实验中,我们尝试使用计算机程序来模拟解决河内塔问题的过程。我们
编写了一个递归算法,通过不断地将问题分解成更小的子问题来模拟人类解决这个谜题的过程。我们将在实验中展示这个算法的运行情况,并对其进行分析和总结。
首先,我们设计了一个简单的图形界面来展示河内塔的三根柱子和圆盘,以及
移动的过程。通过点击按钮,我们可以观察到圆盘在柱子之间的移动情况,以及递归算法的运行过程。实验结果显示,递归算法能够准确地模拟人类解决河内塔问题的过程,而且在圆盘数量较少的情况下,运行速度较快。
接下来,我们对递归算法的运行时间进行了分析。我们发现随着圆盘数量的增加,递归算法的运行时间呈指数级增长。这是因为递归算法在每一步都需要进行多次递归调用,导致运行时间呈指数级增长。因此,在处理大规模的河内塔问题时,递归算法的效率较低,需要考虑其他更加高效的算法。
总结而言,通过这次实验,我们深入了解了河内塔问题以及递归算法的运行原理。我们展示了递归算法在模拟解决河内塔问题时的运行情况,并对其进行了分析和总结。同时,我们也意识到了递归算法在处理大规模问题时的效率问题,需要进一步研究和探讨更加高效的算法。这次实验为我们提供了宝贵的经验,也为我们今后的研究工作提供了参考和借鉴。
人工智能汉诺塔实验报告
汉诺塔实验报告
一、实验目的:
1、掌握产生式系统解决汉诺塔算法的基本思想。
2、熟悉和掌握问题规约法的原理、实质和规约过程。
3、理解规约图的表示方法。
二、实验原理:
1、在移动盘子时,每次只移动A/B/C柱子上可以移动的盘子中最大的盘子。
2、如果上一次已经移动了某个盘子,则下一次不能继续移动,即:一个盘子不能被连续移动两次。如:某次操作将1号盘子由A柱子移动到B柱子,那么在选择下一个要移动的盘子时应不在考虑1号盘。
3、当某个可以移动的盘子摆放位置不唯一时要将当前状态入栈,并选择盘子移动前所在的柱子的左侧(同理:反方向选择也可)柱子作为移动的目标柱子。
为提高程序运行过程中的空间利用率,产生式规则在汉诺塔移动过程中依据以上规则自动生成。
三、实验条件:
1、必须要有三个柱子A,B,C。
2、盘子的数量不能太多。
3、应该用自己熟悉的语言写程序。
四、实验步骤:
第一次移动之后:
第二次移动之后:
第三次移动之后:
五、实验内容:
利用c/c++语言编写汉诺塔程序,并实现盘子的移动过程。
六、实验小结:
通过本次实验我掌握了汉诺塔的算法和移动的过程,同时也更好的运用了c++的知识解决了这个问题,在做的过程中确实有不懂的地
方,但是查资料还是解决了,希望自己以后会更好的利用c++/c这们高级程序编写语言。
数据结构课程报告汉诺塔
目录
1 课题需求......................................... 错误!未定义书签。
2 概要设计 (2)
2.1 递归 (2)
2.2 非递归 (4)
3 详细设计和实现 (2)
4 调试与测试 (11)
4.1 启动窗口 (11)
4.2 递归实现 (11)
4.3 非递归实现 (13)
4.4 退出 (14)
5 致谢 (15)
6 参考文献 (15)
2 概要设计
汉诺塔是一个经典的问题,曾被称为“世界末日问题”。此次程序设计全面讨论
了解决此问题的方案,详细研究,了解,解决问题的算法设计,给出了具体算法,最后由手工输入测试数,运用递归与非递归算法得出结果。
2.1 递归
若只有一个圆盘的话直接将圆盘移至C杆;
若为N个圆盘的话将N-1个圆盘当作整体借助C杆移至B杆,将N号盘
移至C杆,再借助A杆重复上面的操作即可将圆盘移至C杆。
2.2 非递归
看出二叉树实现,假设‘A’一开始有n个圆盘,前n-1个‘A’通过‘C’移到‘B’上看出左孩子,第n个移到‘C’看出根,将‘B’中n-1通过‘A’移到‘C’看成右孩子,建立完全二叉树。主要借助二叉树的非递归中序遍历方法实现,利用栈堆来实现。
3 详细设计和实现
DiGui.cpp文件:
#include<iostream.h>
//递归法解决汉诺塔问题
void HanNuoTaDiGui(int n,char a,char b,char c)
{
if(n<2)
{
cout<<" 圆盘"<<n<<" : 从"<<a<<"移到"<<c<<endl;
数据结构课程设计报告-- 汉诺威塔
数据结构课程设计报告-- 汉诺威塔
数据结构实验课程设计报告
题目:汉诺威塔
学生姓名:
学号:
专业班级:
同组姓名:
指导教师:
设计时间:大二上学期十七周
指导老师意见:
评定成绩:
目录
一.设计目的与要求 (02)
1.1设计目的………………………………………………
02
1.2设计要求………………………………………………
02
二. 设计分
析 (02)
2.1汉诺威塔问题 (02)
2.2算法分析………………………………………………
03
2.3流程图…………………………………………………
06
2.4模块及其功能介绍 (07)
三. 设计实
现 (08)
四. 心得体
会 (09)
五. 参考文
献 (10)
1.设计目的与要求
1.1设计目的
随着计算机技术以及外围设备的发展,计算机在辅助设计制造,计算机教育,计算机信息化应用中,图形的作用和魅力愈加显现。
如何运用计算机技术、运用算法编程来优化解决低阶汉诺威塔问题对我们学生来说具有可实现和可操作性。本次课程设计的目的就是利用所学习到得算法知识和编程语言知识来解决、实现低阶汉诺威塔问题。
1.2设计要求
功能:编程序显示n(n<=9)层汉诺威塔的调整过程。
分步实施:
1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;
2.完成最低要求:实现5层汉诺威塔的调整过程;
3.进一步要求:直至实现n=9时的情况。有兴趣的同学可以自己扩充系统功能。
要求:1)界面友好,函数功能要划分好
2)总体设计应画一流程图
3)程序要加必要的注释
4)要提供程序测试方案
5)程序一定要经得起测试,宁可功能少
汉诺塔实验报告【范本模板】
课程设计2012 年12 月21 日
目录
1、概述....................................................................... 错误!未定义书签。
2、实验目的 .............................................................. 错误!未定义书签。
3、问题分析 (2)
4、实验步骤 .............................................................. 错误!未定义书签。
5、流程图 (3)
6、程序代码: (4)
7、程序调试与测试 (8)
8、结论....................................................................... 错误!未定义书签。
9、总结....................................................................... 错误!未定义书签。
一、概述
数据结构是计算机学科非常重要的一门专业基础理论课程,要想编写针对非数值计算问题的高质量程序,就必须要熟练的掌握这门课程设计的知识。另外,他与计算机其他课程都有密切联系,具有独特的承上启下的重要位置.拥有《数据结构》这门课程的知识准备,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程的都是有益的。
二、实验目的
通过本实验,掌握复杂性问题的分析方法,了解汉诺塔游戏的时间复杂性和空间复杂性.
汉诺塔 C语言数据结构实验报告
汉诺塔问题
一、实验目的
假设有三个分别命名为X,Y和Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,…,n的圆盘,现要求将塔座X上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵守下列规则:(1)每次只能移动一个圆盘,(2)圆盘可以插在X,Y和Z中任一塔座上,(3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。请写一算法,打印出正确的操作步骤。
二、实验内容
利用顺序栈来实现:
(1)程序要求用户输入初始圆盘数
(2)输出所有移动过程
三、实验平台
Microsoft Visual C++
四、设计流程
用结构体数组来模拟栈的结构,其中no为一种标记,当no值为0时表示可以直接移动一个圆盘,当no值为1时表示需进一步分解;ns表示当前圆盘数X Y Z表示三个塔座。由此得到hanoi函数,此函数将X塔座上的n个盘子借助于Y塔座按自下向上从大到小的顺序转移到Z塔座上。
五、源代码清单
//#include "consts.h"
#include <stdio.h>
#define MAXNUM 50
typedef struct
{
int no;
int ns;
char x,y,z;
}Stack;
void Hanoi(Stack st[], int n, char a, char b, char c)
{
int top = 1;
int n1;
char a1, b1, c1;
st[top].no = 1;
st[top].ns = n;
st[top].x = a;
st[top].y = b;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构
学院:信息学院
班级:计科高职13-2 姓名:***
学号:************
汉诺塔程序设计报告
一、题目
汉诺塔(Towers of Hanoi)问题
二、设计要求
1、在窗口中画出初始时塔和碟子的状态。
2、可以以自动或手动两种方式搬移碟子。
3、自动搬移可以通过定时器或多线程的方法,每一次移动的时间间隔可以自定,以人眼观察比较舒服为宜,每一次的移动过程如能实现动画最好。
4、定义塔的描述类和碟子的描述类。
5、在程序中,碟子的数目及每次移动的时间间隔可以通过对话框设置(也应该有默认值)。
6、支持暂停功和继续的功能(在自动搬移过程中可以暂停,并继续)。
7、暂停后,可以将当前的状态保存(碟子和塔的组合关系)。
8、可以从7中保存的文件中读出某个状态,并继续移动。
三、问题分析
1、已知有三个塔(1、
2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。
2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆放至顶部)。
3、每次移动一个碟子。
4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。
5、可以借助塔3。(图1-1)
图1-1
首先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了:
1、将上面的63个盘子移到b杆上;
2、将a杆上剩下的盘子移到c杆上;
3、将b杆上的全部盘子移到c杆上。
将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子....1个盘的工作。
四、算法选择
汉诺塔程序设计算法的实质就是递归递归思想的运用。现将其算法简述如下:
为了更清楚地描述算法,可以定义一个函数hanoi(n,a,b,c)。该函数的功能是:将n个盘子从塔a上借助塔b移动到塔c上。这样移动n 个盘子的工作就可以按照以下过程进行:
1) hanoi(n-1,a,c,b);//将n-1个金盘由a借助c移到b
2) 将最下面的金盘从a移动到c上;
3) hanoi(n-1,b,a,c);//将b上的n-1个盘借助a移到c
重复以上过程,直到将全部的盘子移动到塔c上时为止。
采用递归算法,移动N个盘子所需步骤数为1
n次,64个盘的移动
2
次数是:18,446,744,073,709,551,615。这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年,盘数为10时所需步骤为1023次,可借助计算机解决。本程序用于找出问题的解决方法并解决较小N值(N≤10)时的汉诺塔问题。
五、方案设计
1、为了方便按钮等控件的创建,本程序采用Form框架。
2、定义了塔类CTower和盘类CPlate,分别用于处理塔和盘的操作。
CTower类主要定义塔的坐标、塔上盘的总数、塔上每个盘的编号和位置。
CPlate类定义了金盘的坐标、大小、编号、颜色。
3、为了支持保存功能,将塔和盘在移动过程中的状态信息参数定义在文档类CHanNuoTaDoc中。在视图类中通过文档指针引用这些参数。
4、在视图类CHanNuoTaView中处理塔的移动操作。支持手动和自动两种操作模式。在自动模式中支持暂停和继续功能。两种模式下均可以实现复位操作。
5、设计了游戏设置对话框,用于实现对金盘数目和金盘移动速度的设定。设定后金盘处于初始状态。其对应的类是CGameSet。
六、编程实现
1、CTower类
1)数据成员:
protected:
friend class CHanNuoTaView;
friend class CHanNuoTaDoc;
int status; //塔上盘的数量
int x; //塔的坐标
int y;
int z[10]; //塔上每个盘的序号将CHanNuoTaView类和CHanNuoTaDoc类声明为友元类,便于在这两个类中直接对CTower类数据成员进行操作。
2)成元函数
public :
CTower(); //构造函数
~CTower(); //析构函数
void setzb(int a,int b); //设置坐标
int gethzb(); //获得横坐标
int getczb(); //获得纵坐标
void setstatus(); //设置状态
int getstatus(); //获得状态
void gbstatus(); //改变状态
void setpansz(int x); //设置盘子
int getpansz(); //获得盘子
本程序中在其友元类中直接操作数据,故上述成员函数大多未使用。
2、CPlate类
1)数据成元
protected:
friend class CHanNuoTaView;
friend class CHanNuoTaDoc;
int x,y; //盘的坐标
int number; //盘的编号
int size; //盘的大小
COLORREF color; //盘的颜色
2)成元函数
protedted:
CPlate(); //构造函数
~CPlate(); //析构函数
public:
void setpsz(int x); //设置盘子的大小
int getpsz(); //获得盘子的大小
由于本程序较小,采用友元类方式直接操作该类数据,故有些成元函数没有定义。
3、CHanNuoTaDoc类
1)数据成员
protected: