汉诺塔程序实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验题目:
Hanoi 塔问题
一、问题描述: 假设有三个分别命名为 A , B 和C 的塔座,在塔座 B 上插有n 个直径大小各不相同、从小到 大编号为1, 2,…,n 的圆盘。现要求将塔座 B 上的n 个圆盘移至塔座 A 上并仍按同样顺序 叠排,圆盘移动时必须遵守以下规则:
(1 )每次只能移动一个圆盘;
(2)圆盘可以插在 A , B 和C 中任一塔上;
( 3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
要求: 用程序模拟上述问题解决办法,并输出移动的总次数,
圆盘的个数从键盘输入; 并想
办法计算出程序运行的时间。
二、 算法思路:
1 、建立数学模型: 这个问题可用递归法解决,并用数学归纳法又个别得出普遍解法:
假设塔座B 上有3个圆盘移动到塔座 A 上:
(1) "将塔座B 上2个圆盘借助塔座 A 移动到塔座C 上;
(2) "将塔座B 上1个圆盘移动到塔座 A 上;
(3) "将塔座C 上2个圆盘借助塔座 B 移动到塔座A 上。
其中第 2步可以直接实现。第 1步又可用递归方法分解为:
1.1"将塔座B 上1个圆盘从塔座
1.2"将塔座B 上1个圆盘从塔座
1.3"将塔座A 上1个圆盘从塔座 第 3 步可以分解为:
3.1将塔座C 上1个圆盘从塔座
3.2将塔座C 上1个圆盘从塔座
3.3将塔座B 上1个圆盘从塔座 综上所述:可得到移动 3 个圆盘的步骤为
B->A,B->C, A->C, B->A, C->B, C->A, B->A,
2、算法设计:
将n 个圆盘由B 依次移到A , C 作为辅助塔座。当 n=1时,可以直接完成。否则,将塔 座B 顶上的n-1个圆盘借助塔座 A 移动到塔座C 上;然后将圆盘B 上第n 个圆盘移到塔 座A 上;最后将塔座 C 上的n-1个圆盘移到塔座 A 上,并用塔座B 作为辅助塔座。
三、原程序
#include
#include
void move(char a, char b)
{
printf("%c > %c \n", a,b);
}
void hno(int n,char a , char b, char c) {
if (n==1)
{
move(a,c);
times ++;
}
X 移动到塔座 A ; X 移动到塔座 C ; Z 移动到塔座 C 。
Y 移动到塔座 Y 移动到塔座 X 移动到塔座 B ; A
;
else
{
hn o( n-1,a,c,b);
move(a,c);
times ++;
hn o( n-1,b,a,c);
}
}
void mai n()
{
un sig ned start,fi ni sh;
int N;
printf("请输入汉诺塔的层数:");
scan f("%d",&N);
start=GetTickCou nt();〃
hn o(N,'B',C,'A');
fini sh=GetTickCou nt();
float time=(fi ni sh-start)/1000.0;
printf("共移动了%d 次! \n",times);
cout<<"总共需要时间为:"<