Tower of Hanoi问题动态展示(汉诺塔)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0 A B C
2 B A C
3 A B C
8
0
1 B C A 6
2 B A C
3 A B C
8
0
A
B 8
C
2 B A C
3 A B C
0
6
main() 2 B A C { int m; A B C printf("Input the number3 of disks scanf("%d",&m); printf("The steps to moving %3d hanoi(m,'A','B','C'); (0) } void hanoi(int n,char x,char y,char z) (1) { (2) if(n==1) (3) move(1,x,z); (4) else{ (5) hanoi(n-1,x,z,y); (6) move(n,x,z); (7) hanoi(n-1,y,x,z); (8) } (9) }
void hanoi(1,c,a,b) { if 1==1 move(c,1,b) ; else {…… } }
void hanoi(1,b,c,a) { if 1==1 move(b,1,a) ; else {…… } } void hanoi(1,a,b,c) { if 1==1 move(a,1,c) ; else {…… } }
Tower of Hanoi问题描述
:有A,B,C三个塔座,A上套有n个直
径不同的圆盘,按直径从小到大叠放, 形如宝塔,编号1,2,3……n。要求将n个 圆盘从A移到C,叠放顺序不变,移动 过程中遵循下列原则: 每次只能移一个圆盘 圆盘可在三个塔座上任意移动 任何时刻,每个塔座上不能将大 盘压到小盘上
8 0
A
B
C
1 A B C 8 2 B A C 3 A B C 8 0
A
B 8 0 0
C
2 B A C 3 A B C 3 A B C
栈空
7
执行情况: – 递归工作栈保存内容:形参n,x,y,z和返回地址 – 返回地址用行编号表示
n x y z 返回地址
2
递归函数执行过程
void hanoi(3,a,b,c) { if 3==1 move(a,1,c) else { hanoi(2,a,c,b); move(a,3,c); hanoi(2,b,a,c); } }
hanoi hanoi (n, (n, x, x, y,z) y,z) { { if if (n (n== ==1) 1) move(x, move(x, 1, 1, z); z); else else { { hanoi(n-1, hanoi(n-1, x, x, z, z, y); y); move(x, move(x, n, n, z); z); hanoi(n-1, hanoi(n-1, y, y, x, x, z); z); }} }} a b c
6 0 A B C
1 C A B 8 2 A C B 3 A B C 6 0
A
B 6 0பைடு நூலகம்
C
2 A C B 3 A B C
3 A B C
0
main() { int m; 3 A B C printf("Input the number of disks scanf("%d",&m); printf("The steps to moving %3d hanoi(m,'A','B','C'); (0) } void hanoi(int n,char x,char y,char z) (1) { (2) if(n==1) (3) move(1,x,z); (4) else{ (5) hanoi(n-1,x,z,y); (6) move(n,x,z); (7) hanoi(n-1,y,x,z); (8) } (9) }
1
Tower of Hanoi问题
解决方法: n=1时,直接把圆盘从A移到C n>1时,先把上面n-1个圆盘从A移到B,然后 将n号盘从A移到C,再将n-1个盘从B移到C。即 把求解n个圆盘的Hanoi问题转化为求解n-1个 圆盘的Hanoi问题,依次类推,直至转化成只 有一个圆盘的Hanoi问题
3
void hanoi(2,b,a,c) { if 2==1 move(b,1,c) else { hanoi(1,b,c,a); move(b,2,c); hanoi(1,a,b,c); } }
递 归 函 数 执 行 过 程 中 栈 的 变 化
main() { int m; printf("Input number of disks”); scanf("%d",&m); printf(”Steps : %3d disks”,m); hanoi(m,'A','B','C'); (0) } void hanoi(int n,char x,char y,char z) (1) { (2) if(n==1) (3) move(1,x,z); (4) else{ (5) hanoi(n-1,x,z,y); (6) move(n,x,z); (7) hanoi(n-1,y,x,z); (8) } (9) }
void hanoi(2,a,c,b) { if 2==1 move(a,1,b) else { hanoi(1,a,b,c); move(a,2,b); hanoi(1,c,a,b) } }
void hanoi(1,a,b,c) { if 1==1 move(a,1,c) ; else {……} }
1 2 3 A 3 A B C
B 0
C
2 A C B
3 A B C
6
0
1 A B C 6 2 A C B 6
3 A B C
0
A
B 6 0
C
2 A C B 3 A B C
4
main() 2 A C B { int m; 3disks A B C printf("Input the number of scanf("%d",&m); printf("The steps to moving %3d hanoi(m,'A','B','C'); (0) } void hanoi(int n,char x,char y,char z) (1) { (2) if(n==1) (3) move(1,x,z); (4) else{ (5) hanoi(n-1,x,z,y); (6) move(n,x,z); (7) hanoi(n-1,y,x,z); (8) } (9) }