VC++作业 电信学院电子0801 班 张海滨 20809050 — 1 — 汉诺塔程序设计报告 一、题目 汉诺塔(Towers of Hanoi)问题 二、设计要求 1、在窗口中画出初始时塔和碟子的状态。 2、可以以自动或手动两种方式搬移碟子。 3、 自动搬移可以通过定时器或多线程的方法,每一次移动的时间间隔可以自定,以人眼观察比较舒服为宜,每一次的移动过程如能实现动画最好。 4、定义塔的描述类和碟子的描述类。 5、 在程序中,碟子的数目及每次移动的时间间隔可以通过对话框设置(也应该有默认值)。 6、支持暂停功和继续的功能(在自动搬移过程中可以暂停,并继续)。 7、暂停后,可以将当前的状态保存(碟子和塔的组合关系)。 8、可以从7 中保存的文件中读出某个状态,并继续移动。 三、问题分析 1、已知有三个塔(1、 2、 3)和n 个从大到小的金碟子,初始状态时 n 个碟子按从大到小的次序从塔1 的底部堆放至顶部。 2、要求把碟子都移动到塔2(按从大到小的次序从塔2 的底部堆放至顶部)。 3、每次移动一个碟子。 — 2 — 4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。 5、可以借助塔3。(图1-1) 图 1-1 首先考虑a 杆下面的盘子而非杆上最上面的盘子,于是任务变成了: 1、将上面的63 个盘子移到b 杆上; 2、将a 杆上剩下的盘子移到c 杆上; 3、将b 杆上的全部盘子移到c 杆上。 将这个过程继续下去,就是要先完成移动63 个盘子、62 个盘子、61 个盘子....1 个盘的工作。 四、算法选择 汉诺塔程序设计算法的实质就是递归递归思想的运用。现将其算法简述如下: 为了更清楚地描述算法,可以定义一个函数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 — 3) hanoi(n-1,b,a,c); //将 b 上的n-1 个盘借助a 移到c 重复以上过程,直到将全部的盘子移动到塔c 上时为止。 采用递归算法,移动N 个盘子所需步骤数为12n次,64 个盘的移动次数是:18, 446, 744, 073, 709, 551, 615。这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年,盘数为10 时所需步骤为1023 次 ,可借助计算机解决。本程序用于找出问题的解决方法并解决较小N 值...