汉诺塔程序设计报告.docVIP

  • 32
  • 0
  • 约5.83千字
  • 约 13页
  • 2016-06-06 发布于重庆
  • 举报
汉诺塔程序设计报告

VC++作业 电信学院电子0801班 张海滨 汉诺塔程序设计报告 一、题目 汉诺塔(Towers of Hanoi)问题 二、设计要求 1、在窗口中画出初始时塔和碟子的状态。 2、可以以自动或手动两种方式搬移碟子。 3、自动搬移可以通过定时器或多线程的方法,每一次移动的时间间隔可以自定,以人眼观察比较舒服为宜,每一次的移动过程如能实现动画最好。 4、定义塔的描述类和碟子的描述类。 5、在程序中,碟子的数目及每次移动的时间间隔可以通过对话框设置(也应该有默认值)。 6、支持暂停功和继续的功能(在自动搬移过程中可以暂停,并继续)。 7、暂停后,可以将当前的状态保存(碟子和塔的组合关系)。 8、可以从7中保存的文件中读出某个状态,并继续移动。 三、问题分析 1、已知有三个塔(1、2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。 2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆放至顶部)。 3、每次移动一个碟子。 4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。 5、可以借助塔3。(图1-1) 图1-1 首先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了: 将上面的63个盘子移到b杆上;将a杆上剩下的盘子移到c杆上;将b杆上的全部盘子移到c杆上。将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子....的工作。 为了更清楚地描述算法,可以定义一个函数hanoi(n,a,b,c)。该函数的功能是:将n个盘子从塔a上借助塔b移动到塔c上。这样移动n个盘子的工作就可以按照以下过程进行: 1) hanoi(n-1,a,c,b);//将n-1个金盘由a借助c移到b 2) 将最下面的金盘从a移动到c上; 3) hanoi(n-1,b,a,c);//将b上的n-1个盘借助a移到c 重复以上过程,直到将全部的盘子移动到塔c上时为止。 采用递归算法,移动N个盘子所需步骤数为次,64个盘的移动次数是:18,446,744,073,709,551,615这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年10时所需步骤为1023次,可借助计算机解决。本程序用于找出问题的解决方法并解决较小N值10)时的汉诺塔 五、方案设计 1、为了方便按钮等控件的创建,本程序采用Form框架。 2、定义了塔类CTower和盘类CPlate,分别用于处理塔和盘的操作。 CTower类主要定义塔的坐标、塔上盘的总数、塔上每个盘的编号和位置。 CPlate类定义了金盘的坐标、大小、编号、颜色。 3、为了支持保存功能,将塔和盘在移动过程中的状态信息参数定义在文档类CHanNuoTaDoc中。在视图类中通过文档指针引用这些参数。 4、在视图类CHanNuoTaView中处理塔的移动操作。支持手动和自动两种操作模式。在自动模式中支持暂停和继续功能。两种模式下均可以实现复位操作。 5、设计了游戏设置对话框,用于实现对金盘数目和金盘移动速度的设定。设定后金盘处于初始状态。其对应的类是CGameSet。 六、编程实现 1、CTower类 1)数据成员: protected: friend class CHanNuoTaView; friend class CHanNuoTaDoc; int status; //塔上盘的数量 int x; //塔的坐标 int y; int z[10]; //塔上每个盘的序号 将CHanNuoTaView类和CHanNuoTaDoc类声明为友元类,便于在这两个类中直接对CTower类数据成员进行操作。 2)成元函数 public : CTower(); //构造函数 ~CTower(); //析构函数 void setzb(int a,int b); //设置坐标 int gethzb(); //获得横坐标 int getczb(); //获得纵坐标 void setstatus(); //设置状态 int getstatus(); //获得状态 void gbstatus(); //改变状态 void setpansz(int x); //设置盘子 int getpansz(); //获得盘子 本程序中在其友元类中直接操作数据,故上述成

文档评论(0)

1亿VIP精品文档

相关文档