1 / 13
文档名称:

汉诺塔试验报告-源程序.doc

格式:doc   大小:150KB   页数:13页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

汉诺塔试验报告-源程序.doc

上传人:changjinlai 2017/12/30 文件大小:150 KB

下载得到文件列表

汉诺塔试验报告-源程序.doc

文档介绍

文档介绍:汉诺塔文档
一、软件概述:
汉诺塔(Hanoi) 是一个古老的数学问题。相传在古印度的布拉玛婆罗门圣庙的僧侣在进行一种被称为汉诺塔的游戏,其装置是一块铜板,上面有三根杆(编号1、2、3),1杆上自下而上、由大到小按顺序串上64个金盘(如图,由于空间有限,只画了10个盘)。游戏的目标是把1杆上的金盘全部移到3杆上,并仍原有顺序叠好。条件是每次只能移动一个盘,并且在每次移动都不允许大盘移到小盘之上。现要求利用递归调用技术给出N个盘从1杆移到3杆的移动过程。
图1 汉诺塔问题
二、思路分析
、算法:
:(递归算法)
这个移动过程很复杂与烦琐,但规律性却很强。使用递归调用技术来解决这个移动过程,先得找到一个递归调用模型。想要得到汉诺塔问题的简单解法,着眼点应该是移动A杆最底部的大盘,而不是其顶部的小盘。不考虑64个盘而考虑N个盘的一般情况。要想将A杆上的N个盘移至C杆,我们可以这样设想:
,从A杆将1至N-1号盘移至B杆。

,从B杆将1至N-1号盘移至C杆。
:(循环算法)
在程序中开一个2维的数组iResultArray[][],由数学公式,移动N个盘所需要的步骤是2^N-1步,通过计算算得这个步数,计入变量iStep,则iResultArray有2^N-1行,每行2个元素,其中第一个元素是源盘所在的轴号(用1,2,3表示),第二个元素是目的盘所在的轴号。
为叙述方便,现假设盘子的数目有4个。则可分解为:第一阶段:将1号盘从1轴移至2轴;第二阶段:将2号盘从1轴移至3轴,将1号盘从2轴移至3轴;第三阶段:将3号盘从1轴移至2轴,将1,2号盘从3轴移至2轴;第四阶段:将4号盘从1轴移至3轴,将1,2,3号盘从2轴移至3轴。
对于第J个阶段,都是将1轴中的可以移动的盘子A移到没有盘子的轴上,然后将剩下的那组盘子移动到A上,而这一步又恰是第J-1个阶段的重演,但源轴号和目的轴号都有变。
假设第1~J-1个盘子已经被从原来的第i1轴经过i2轴最终移到了i3轴,则第J阶段为:1,将第J个盘子从第1轴移动到第i2轴,再将i3看作上一步的i1,i1看作上一步的i2,i2看作上一步的i3,经过这样一个变化后重演第J-1阶段以前的工作。这个重演可以看作是对iResultArray数组中小于等于2^(iStep-1)的替换。从而实现重复算法。
界面实现
在控制界面类MyPanel中设置3*10的iDiskStack [][]二维数组用以表示盘片的位置,假设iDiskStack [1][1]=10,则第1个轴上最底下位置上放着第10号盘片。( 出于若盘片过多,运算量太大,则程序将无法终止,故只设最大为10个盘片) 假设iDiskStack [2][10]=5,则第2个轴上最高的位置上放着第5号盘片, 以此类推。在每输入一个新的盘片数N时(1<N<=10),程序会初始化1~N号盘片的位置。并通过函数MoveStep()来控制每步的情况。比如程序在运行期间,发出一个一MoveStep(1,3)的情求,则程序会搜索iDiskStack[1]里面下标最大的非0元素(即1号轴上最顶上的盘子)并将其移动到iDiskStack[3] 里面下标最小的0元素(即1号轴上最顶上的盘子的紧挨着的上面一个位置),并调用paintImmediately强制重绘屏幕。
三、使用方法:

硬件:INTEL Pentium II PC 或以上机型。
软件:Microsoft Windows 98/ME/2000/XP/2003 或 LINUX等
Java 2 sdk 版或以上

1,首先下载安装Java 2 sdk (如果已经正确安装该版本或以上版本的JSDK,则可跳到步骤3)
2,打开Windows的系统变量属性页,在path中添加
“C:\\bin;C:\\jre\bin”
二项,在CLASSPATH添加
“.;C:\\lib;C:\\jre\lib”
(其中C:\ 2 sdk )
3,点击开始-运行-cmd(mand)
4,通过cd命令进入本程序所在的文件夹,
5,敲入“java Hanoia”,回车(注意大小写)
如果出现如下图形界面,则恭喜您!您已经正确安装!
图2 首次进入程序界面

1,正确安装后,您可以看到图2
2,在程序右上角的数字提