




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课课 程程 设设 计计 2012 年12 月21日 目录目录 1、概述、概述.4 2 2、实验目的、实验目的.4 3 3、问题分析、问题分析.5 4 4、实验步骤、实验步骤.5 5 5、流程图、流程图.6 6 6、程序代码:、程序代码:.7 7 7、程序调试与测试、程序调试与测试.10 8 8、结论、结论.12 9 9、总结、总结.15 一、概述一、概述 数据结构是计算机学科非常重要的一门专业基础理论课程,要想编写针对非数值计算问 题的高质量程序,就必须要熟练的掌握这门课程设计的知识。另外,他与计算机其他课程 都有密切联系,具有独特的承上启下的重要位置。拥有数据结构这门课程的知识准备, 对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程的都是有益的。 二、实验目的二、实验目的 通过本实验,掌握复杂性问题的分析方法,了解汉诺塔游戏的时间复杂性和空 间复杂性。 三、问题分析三、问题分析 任务:有三个柱子 A, B, C. A 柱子上叠放有 n 个盘子,每个盘子都比它下面的盘子要 小一点, 可以从上到下用 1, 2, ., n 编号。要求借助柱子 B,把柱子 A 上的所有的盘子移动到柱子 C 上。 移动条件为:1、一次只能移一个盘子; 2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。 分析:首先容易证明,当盘子的个数为 n 时,移动的次数应等于 2n - 1。 首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子 A 上。 根据圆盘的数量确定柱子的排放顺序:若 n 为偶数,按顺时针方向依次摆放 A B C; 若 n 为奇数,按顺时针方向依次摆放 A C B。 (1)按顺时针方向把圆盘 1 从现在的柱子移动到下一根柱子,即当 n 为偶数时,若圆盘 1 在柱子 A,则把它移动到 B; 若圆盘 1 在柱子 B,则把它移动到 C;若圆盘 1 在柱子 C,则把它移动到 A。 (2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。 即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘 这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行 动是唯一的。 反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。 四、实验步骤四、实验步骤 1、用 c+ 或 c 语言设计实现汉诺塔游戏;, 2、让盘子数从 2 开始到 7 进行实验,记录程序运行时间和递归调用次数; 3、画出盘子数 n 和运行时间 t 、递归调用次数 m 的关系图,并进行分析。 五、流程图五、流程图 开始 输入 m(m=20) 是否继续 结束 输出结果 2、 否 1、是 六、程序代码:六、程序代码: #include #include / Hanoi 塔 class Hanoi public: Hanoi() cout floor; if (floor 20) cout 层数错误重新输入:; goto input; cout endl; arrayA = new char *floor; arrayB = new char *floor; arrayC = new char *floor; for (int h = 0; h floor; h+) arrayAh = new charfloor + 1; arrayBh = new charfloor + 1; arrayCh = new charfloor + 1; for(int i = 0; i floor; i+) for(int j = 0; j floor + 1; j+) arrayAij = 0; arrayBij = 0; arrayCij = 0; for(int n = 0; n floor; n+) for(int m = 0; m = n; m+) arrayAnm = #; stepcount = 0; void HanoiShow() hanoiShow(floor, arrayA, arrayB, arrayC); void Display() system(cls); cout 第 stepcount 步 endl; int i; int j; for(i = 0; i floor + 1; i+) if(i = 0) cout A; else cout ; cout ; for(i = 0; i floor + 1; i+) if(i = 0) cout B; else cout ; cout ; for(i = 0; i floor + 1; i+) if(i = 0) cout C; else cout ; cout endl; for(i = 0; i floor; i+) for(j = 0; j floor + 1; j+) cout arrayAij; cout ; for(j = 0; j floor + 1; j+) cout arrayBij; cout ; for(j = 0; j floor + 1; j+) cout arrayCij; cout endl; system(pause); Hanoi() for (int i = 0; i 0) hanoiShow(n - 1, A, C, B); move(n, A, B); hanoiShow(n - 1, C, B, A); else return; void move(int n, char *D, char *S) int dc = -1; int sc = -1; int i; int j; for(i = 0; i floor; i+) if(Di0 = #) dc = i; break; for(j = 0; j floor; j+) if(Sj0 = #) sc = j - 1; break; if(sc = -1) sc = floor - 1; for(int k = 0; k floor + 1; k+) Ssck = Ddck; Ddck = 0; stepcount+; Display(); int stepcount; int floor; char *arrayA; char *arrayB; char *arrayC; ; #endif 自定义头文件 #include stdafx.h #include Hanoi.h 七、程序调试与测试七、程序调试与测试 在编译过程中发现错误 经查找之后发现没有对主函数 main 说明 经改正后 运行结果运行结果 第一步第一步 先输入要玩的层数 第二步第二步 手动运行手动运行 八、结论八、结论 通过对上述递归在 Hanoi 塔问题上的应用分析,我们可以得出如下结论: 1、递归调用过程中,在程序执行之前无法知道控制这种调用栈的规模,因为这 一规模取决于递归调用的次序。在这种情况下,程序的地址空间可能动态变化; 2、递归应用于程序设计时,结构清晰、程序易读,编制和调试程序很方便,不 需要用户自行管理递归工作栈。但递归应用于计算机时需要占用大量系统资源 (包括堆栈、软中断和存贮空间等),并消耗大量处理时间。因此,可以考虑 采用并行计
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 烯烃炔烃试题及答案
- 能源概论试题及答案
- 生活药学考试题及答案
- 中交安全考试试题及答案
- 2025年国家电投集团福建核电招聘考试笔试试题(含答案)
- 北京知识型直播培训课件
- 2025年甘肃烟草公司招聘考试笔试试题(含答案)
- 2025年恩施州鹤峰县县直教育单位选调教师考试笔试试题(含答案)
- 2024年云南省社区《网格员》考前冲刺训练(含答案)
- 干燥综合征及护理试题(含答案)
- 慢性疾病管理与健康指导手册
- 2025年高中音乐教师招聘考试测试题及参考答案
- 主持人基础知识培训课件
- 2025年储能运维面试题及答案
- 2025年安徽演艺集团有限责任公司招聘20人笔试备考题库及答案详解(名师系列)
- 2025年事业单位考试医学基础知识真题及答案解析(医疗卫生系统)
- 建筑工地基孔肯雅热防控和应急方案
- 车间现场6S管理课件
- 计量基础知识培训课件
- 2025年新反洗钱知识竞赛题库(附含答案)
- 融媒体中心媒资管理办法
评论
0/150
提交评论