收藏 分享(赏)

汉诺塔代码.doc

上传人:tkhy51908 文档编号:7722601 上传时间:2019-05-24 格式:DOC 页数:8 大小:64KB
下载 相关 举报
汉诺塔代码.doc_第1页
第1页 / 共8页
汉诺塔代码.doc_第2页
第2页 / 共8页
汉诺塔代码.doc_第3页
第3页 / 共8页
汉诺塔代码.doc_第4页
第4页 / 共8页
汉诺塔代码.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、-1-一、实验目的用回非递归方法解决汉诺塔问题。二、算法原理汉诺塔游戏,其规则如下:1.有三根杆子 A,B,C。A 杆上有若干碟子 2.每次移动一块碟子,小的只能叠在大的上面 3.把所有碟子从 A 杆全部移到 C 杆上可以看出,当 n=1 时,直接将源柱上的盘子移到目标柱即可。当 n 大于等于 2 时,移动的过程可分解为三个步骤:第一步 把 A 上的 n-1 个圆盘移到中间柱上;第二步 把 A 上的一个圆盘移到目标柱上;第三步 把 B 上的 n-1 个圆盘移到目标柱上。最终以最大的盘子落到最初的目标柱上为目的,不断改变中间柱和目标柱,达到移动目的。此问题本身具有地归性,然而用非递归方法也是可以

2、解决的。三、算法描述(解决问题的步骤、流程图)可以看出,当对于规模为 n 的 hanoi,1 奇数编号盘子总是移动移动到它后的第 2 个柱子上2 偶数编号的盘子总是移动移动到它的后第 1 个柱子上流程图如下:-2-Start 给每个盘子编号EndInput n初始化柱子和盘子状态盘子号和 n 同奇或同偶?向右移动一位移动向右移动两位源柱上当前盘子变为下一个是否移动完?是否无空柱?找到柱顶盘子最小的柱子找到该柱右边的柱子四、实验环境软件平台:windows XP SP3 下,Visual C+ 6.0 编译 硬件平台:Inter Core 2 Duo CPUE4500 2.20GHz 2.20G

3、Hz, 1.00GB 内存-3-五、实验过程及结果六、结论(总结及下一步优化改进)这个程序主要是根据这样的规律:如果把三个柱子围成一个环,盘子总数为 N,其移动的规律是:如果 N 为偶数:奇数号盘每次 2 步;偶数号盘每次 1 步;如果 N 为奇数:奇数号盘每次 1 步;偶数号盘每次 2 步;当三个柱子都不为空则优先移动最小的盘子。而这个规律,可以通过如下表格得出:步 1 2 3 4 5 6 7 8 9 10 11 12 13 14 150 1,2 1,2 1,2 1,2 1,2 1,2 1,2 1,21 2,1 2,1 2,1 2,12 1,2 1,23 2,1七、附源代码#include#

4、include#define N 7#define X dishi.dnum-4-#define Y dishi.lnum#define SP dishi.pegint mov1(int,int);/向右走一步int mov2(int,int);/向右走两步struct dishint dnum;/自身编号int lnum;/下面的盘子int peg; /所在的柱子dishN;int s3=N;/初始化每个柱的状态为空void main()int n;int i,change=1,j;for(i=0;i=n if(sdishi.peg!=dishi.dnum) /当上面有盘子时不能移动cont

5、inue;if(n%2=0 -6-else change=mov2(SP,X);if(!change)if(s0x)/要移动的目标是可以承载当前盘子的printf(“nmove1n“);printf(“%d %d %dn“,x,sp,(sp+1)%3);-7-sdishx.peg=dishx.lnum; /x盘所在柱子减去当前盘,顶盘变为 x盘的下一个dishx.lnum=s(dishx.peg+1)%3; /x盘的落点即 x转移后的下面的盘s(dishx.peg+1)%3=dishx.dnum; /x盘转移到的柱子顶盘值变为 x盘值dishx.peg=(dishx.peg+1)%3; /x盘

6、所在柱子变为落点柱子return 1; /转移成功else return 0; /转移失败int mov2(int sp,int x) if(s(sp+2)%3x)/要移动的目标是可以承载当前盘子的printf(“nmove2n“);printf(“%d: %d %dn“,x,sp,(sp+2)%3);sdishx.peg=dishx.lnum; /x盘所在柱子减去当前盘,顶盘变为 x盘的下一个dishx.lnum=s(dishx.peg+2)%3; /x盘的-8-落点即 x转移后的下面的盘s(dishx.peg+2)%3=dishx.dnum; /x盘转移到的柱子顶盘值变为 x盘值dishx.peg=(dishx.peg+2)%3; /x盘所在柱子变为落点柱子return 1; /转移成功else return 0; /转移失败

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报