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) han