分治法之汉诺塔实验报告_第1页
分治法之汉诺塔实验报告_第2页
分治法之汉诺塔实验报告_第3页
分治法之汉诺塔实验报告_第4页
分治法之汉诺塔实验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、陕西师范大学实验报告课题名称 算法分析与设计项目名称 分治法 汉诺塔问题学 院 计算机科学学院专 业 计算机科学与技术指导老师 王小明 小组人员 刘永军 高富雷 武子超 报告时间 2013/11/28 2013/11/28分治法之汉诺塔问题目录一、设计目的3二、设计内容31任务描述3i.汉诺塔问题简介3ii.设计任务简介32分治法算法的实现过程4三、流程图6四、测试结果7五、总结7附:程序源代码7一、 设计目的1、掌握分治法的思想;2、掌握分治法的典型问题,如汉诺塔问题以及其他问题;3、进一步多级调度的基本思想和算法设计方法;4、提高分析与解决问题的能力。二、 设计内容1 任务描述i. 汉诺塔

2、问题简介在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神大梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从大梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。ii. 设计任务简介其实算法非常简单,当盘子的个数为n时,移动的次数应等于2n - 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步

3、操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子a上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 a b c; 若n为奇数,按顺时针方向依次摆放 a c b。 (1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子a,则把它移动到b;若圆盘1在柱子b,则把它移动到c;若圆盘1在柱子c,则把它移动到a。 (2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施

4、的行动是唯一的。 (3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。 所以结果非常简单,就是按照移动规则向一个方向移动金片: 如3阶汉诺塔的移动:ac,ab,cb,ac,ba,bc,ac。2 分治法算法的实现过程首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子a上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 a b c; 若n为奇数,按顺时针方向依次摆放 a c b。 (1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子a,则把它移动到b;若圆盘1在柱子b,则把它移动到c;若圆盘1在柱子c,则把它移动到

5、a。 (2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。 (3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。 所以结果非常简单,就是按照移动规则向一个方向移动金片:如是解决,我们就可以将n个盘分治成1个,2个,3个盘来讨论,如1阶汉诺塔的移动: ac;如2阶汉诺塔的移动:ab, ac, bc;如3阶汉诺塔的移动:ac,ab,cb,ac,ba,bc,ac。通过最简单的,最少阶数汉诺塔的移动,我们更具上面的讲解,联

6、想到更多的阶数,不难看出其中的规律!因此,我们通过将多阶汉诺塔分解成少数像3阶一样的汉诺塔,从繁化简,分而治之。解决汉诺塔问题。算法如下:void move(char a,int n,char c)printf(%c-%cn,a,c);void hanoi(int n, char a, char b, char c, int &time) if (n=0) return; if (n=1) move(a,1,c); time+; else hanoi(n-1,a,c,b, time); move(a,n,c);time+; hanoi(n-1,b,a,c, time); int main()

7、int n; printf(请输入汉诺塔的盘数: ); scanf(%d,&n); int time = 0; printf(%d个盘的汉诺塔移动方法是n:,n);hanoi(n,a,b,c,time); printf(移动了%d次n, time);getchar();getchar();return 0;算法分析:我们通过递归调用,主函数main()调用hanoi()函数,hanoi()函数在调用move()函数,以及hanoi()函数对自身的调用,在hanoi()函数自身调用中参数a,b的交换,实现了品字形排列,顺序逆序的实现,从而解决问题。通过time参数的计算,我可可以知道该函数的时间

8、复杂度是o(2n)。其实我们通过数学归纳法就可以知道n阶汉诺塔需要移动的次数为2n-1。三、 流程图四、 测试结果五、 总结这次的设计的主要内容是分治算法,汉诺塔问题不难,但却是典型的分治算法中递归调用案例之一。因此通过这次练习,让我们小组更加深刻的认识到分治法的优越性以及优中求优,对算法加以修正,做到最好。附:程序源代码/ 汉罗塔.cpp : 定义控制台应用程序的入口点。/#includestdafx.h#include #include void move(char a,int n,char c)printf(%c-%cn,a,c);void hanoi(int n, char a, char b, char c, int &time) if (n=0) return; if (n=1) move(a,1,c); time+; else hanoi(n-1,a,c,b, time); move(a,n,c);time+; hanoi(n-1,b,a,c, time); int main() int n; printf(请输入汉诺

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论