1 / 8
文档名称:

汉诺塔代码.doc

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

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

分享

预览

汉诺塔代码.doc

上传人:n22x33 2015/11/3 文件大小:0 KB

下载得到文件列表

汉诺塔代码.doc

文档介绍

文档介绍:一、实验目的
用回非递归方法解决汉诺塔问题。
二、算法原理
汉诺塔游戏,其规则如下:
,B,C。A杆上有若干碟子
,小的只能叠在大的上面

可以看出,当n=1时,直接将源柱上的盘子移到目标柱即可。当n大于等于2时,移动的过程可分解为三个步骤:
第一步  把A上的n-1个圆盘移到中间柱上;
第二步  把A上的一个圆盘移到目标柱上;
第三步  把B上的n-1个圆盘移到目标柱上。
最终以最大的盘子落到最初的目标柱上为目的,不断改变中间柱和目标柱,达到移动目的。此问题本身具有地归性,然而用非递归方法也是可以解决的。
三、算法描述(解决问题的步骤、流程图)
可以看出,当对于规模为n的hanoi,
1.  奇数编号盘子总是移动移动到它后的第2个柱子上
2.  偶数编号的盘子总是移动移动到它的后第1个柱子上
∴流程图如下:
Start
给每个盘子编号
End
Input n
初始化柱子和盘子状态
盘子号和 n同奇或同偶?
向右移动一位
移动
向右移动两位
源柱上当前盘子变为下一个
是否移动完?
是否无空柱?
找到柱顶盘子最小的柱子
找到该柱右边的柱子
四、实验环境
软件平台:windows XP SP3下,Visual C++
硬件平台:Inter® Core™ 2 Duo CPU
E4500 @ ,
五、实验过程及结果
六、结论(总结及下一步优化改进)
这个程序主要是根据这样的规律:如果把三个柱子围成一个环,盘子总数为N,其移动的规律是:如果N为偶数:奇数号盘每次2步;偶数号盘每次1步;如果N为奇数:奇数号盘每次1步;偶数号盘每次2步;当三个柱子都不为空则优先移动最小的盘子。
而这个规律,可以通过如下表格得出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
1,2
1,2
1,2
1,2
1,2
1,2
1,2
1,2
1
2,1
2,1
2,1
2,1
2
1,2
1,2
3
2,1
七、附源代码
#include<>
#include<>
#define N 7
#define X dish[i].dnum
#define Y dish[i].lnum
#define SP dish[i].peg
int mov1(int,int);//向右走一步
int mov2(int,int);//向右走两步
struct dish
{
int dnum; //自身编号
int lnum; //下面的盘子
int peg; //所在的柱子
}dish[N];
int s[3]={N};//初始化每个柱的状态为空
void main()
{
int n;
int i,change=1,j;
for(i=0;i<N;i++)
{
dish[i].dnum=i; //作为盘子的唯一标识,顶层为0,最高级的最大盘子为N-1
dish[i].lnum=i+1; //底层