汉诺塔实验报告Word格式文档下载.docx

上传人:b****2 文档编号:14975492 上传时间:2022-10-26 格式:DOCX 页数:9 大小:53.87KB
下载 相关 举报
汉诺塔实验报告Word格式文档下载.docx_第1页
第1页 / 共9页
汉诺塔实验报告Word格式文档下载.docx_第2页
第2页 / 共9页
汉诺塔实验报告Word格式文档下载.docx_第3页
第3页 / 共9页
汉诺塔实验报告Word格式文档下载.docx_第4页
第4页 / 共9页
汉诺塔实验报告Word格式文档下载.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

汉诺塔实验报告Word格式文档下载.docx

《汉诺塔实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汉诺塔实验报告Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。

汉诺塔实验报告Word格式文档下载.docx

二、实验目的

通过本实验,掌握复杂性问题的分析方法,了解汉诺塔游戏的时间复杂性和空

间复杂性。

三、问题分析

任务:

有三个柱子A,B,C.A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小

一点,

可以从上到下用1,2,...,n编号。

要求借助柱子B,把柱子A上的所有的盘子移动到柱子C上。

移动条件为:

1、一次只能移一个盘子;

2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。

分析:

首先容易证明,当盘子的个数为n时,移动的次数应等于2^n-1。

首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上。

根据圆盘的数量确定柱子的排放顺序:

若n为偶数,按顺时针方向依次摆放ABC;

若n为奇数,按顺时针方向依次摆放ACB。

(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)

输出结果

1、是

是否继续

2、否

结束

六、程序代码:

#include<

iostream.h>

stdlib.h>

//Hanoi塔

classHanoi

{

public:

Hanoi()

cout<

<

"

请输入你想玩的层数(1-20):

"

;

input:

cin>

>

floor;

if(floor<

1||floor>

20)

层数错误重新输入:

gotoinput;

}

endl;

arrayA=newchar*[floor];

arrayB=newchar*[floor];

arrayC=newchar*[floor];

for(inth=0;

h<

h++)

arrayA[h]=newchar[floor+1];

arrayB[h]=newchar[floor+1];

arrayC[h]=newchar[floor+1];

for(inti=0;

i<

i++)

for(intj=0;

j<

floor+1;

j++)

arrayA[i][j]='

\0'

arrayB[i][j]='

arrayC[i][j]='

for(intn=0;

n<

n++)

for(intm=0;

m<

=n;

m++)

arrayA[n][m]='

#'

stepcount=0;

voidHanoiShow()

hanoiShow(floor,arrayA,arrayB,arrayC);

voidDisplay()

system("

cls"

);

第"

<

stepcount<

步"

inti;

intj;

for(i=0;

if(i==0)

'

A'

else

B'

C'

for(j=0;

arrayA[i][j];

arrayB[i][j];

arrayC[i][j];

pause"

~Hanoi()

for(inti=0;

delete[]arrayA[i];

delete[]arrayB[i];

delete[]arrayC[i];

delete[]arrayA;

delete[]arrayB;

delete[]arrayC;

private:

voidhanoiShow(intn,char**A,char**B,char**C)

if(n>

0)

1,A,C,B);

hanoiShow(n-

move(n,A,B);

hanoiShow(n-1,C,B,A);

return;

voidmove(intn,char**D,char**S)

intdc=-1;

intsc=-1;

if(D[i][0]=='

dc=i;

break;

if(S[j][0]=='

sc=j-1;

if(sc==-1)

sc=floor-1;

for(intk=0;

k<

k++)

S[sc][k]=D[dc][k];

D[dc][k]='

stepcount++;

Display();

intstepcount;

intfloor;

char**arrayA;

char**arrayB;

char**arrayC;

};

#endif

自定义头文件

#include"

stdafx.h"

#include"

Hanoi.h"

七、程序调试与测试

在编译过程中发现错误

经查找之后发现没有对主函数main说明

经改正后

运行结果

第一步

先输入要玩的层数

第二步

手动运行

八、结论

通过对上述递归在Hanoi塔问题上的应用分析,我们可以得出如下结论:

1、递归调用过程中,在程序执行之前无法知道控制这种调用栈的规模,因为这一规模取决于递归调用的次序。

在这种情况下,程序的地址空间可能动态变化;

2、递归应用于程序设计时,结构清晰、程序易读,编制和调试程序很方便,不需要用户自行管理递归工作栈。

但递归应用于计算机时需要占用大量系统资源(包括堆栈、软中断和存贮空间等),并消耗大量处理时间。

因此,可以考虑采用并行计算进行处理,但

3、递归是串行的,其第n步运算依赖于第n-1步运算,所以在计算机软件理论上不存在递归问题并行计算的可能性。

实际上是否存在并行递归计算有待进一步探讨。

九、总结

通过对汉诺塔算法的分析让我更清楚的认识到了不同的算法对程序性能的影响,

也让我明白掌握了算法将会有助于提高软件的开发。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1