汉诺塔问题2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• • • • • • • • • • • • • • • • • • • •
else { s->top++; s->data[s->top]=e; return 1; } } int Pop(SqStack *&s,int &e) /* 出栈*/ { if(s->top==-1) //栈为空 { return 0; } else { e=s->data[s->top]; s->top--; return 1; } }
/*进栈*/
/*出栈*/
• • • • • • • • • • • • • • • • • • • • •
{ If(栈空) return 0; else 则删除s的栈顶元素,用e返回其值,并返回1;
} DestroyStack(SqStack *&s) { 销毁栈s,s不再存在; } Hanoi() //通过递归将盘子从A移到C If(n==1) { 直接将A中的盘子移到C上; } else { 先把A上的n-1个盘子从A 借助C移到B; 再将A上的第n个盘子移到C; 再把B上的n-1个盘子借助A移到C; }
/*销毁栈*/
• 源程序
• • • • • • • • • • • • • • • • • • • • #include<stdio.h> #include<stdlib.h> #define MaxSize 64 //圆盘的个数最多为64 typedef struct { int data[MaxSize]; //柱子上的圆盘存储情况 char name; //柱子的名字,可以是A,B,C中的一个 int top; //栈顶 }SqStack; //建立栈 int r=0; void InitStack(SqStack *&s) /*初始化栈*/ { s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1; //栈空 } int Push(SqStack *&s,int e) /*进栈*/ { if((s->top)>(MaxSize-1)) //栈满 { return 0; }
• • • • • • • • • • • • • • • • • • •
else { Hanoi(n-1,a,c,b); Move(a,c); i++; Hanoi(n-1,b,a,c); } return i; } int main() { int n,i; SqStack *a,*b,*c; InitStack(a); InitStack(b); InitStack(c); a->name='A'; b->name='B'; c->name='C';
• • • • • • • • • • • • • • • • • • • •
void DestroyStack(SqStack *&s) // 销毁栈 { free(s); } void Move(SqStack *&a,SqStack *&b) { int i; Pop(a,i); printf("第%d步: %d盘----从---->%c塔座----移到------>%c塔座\n",++r,i,a>name,b->name); Push(b,i); } int Hanoi(int n,SqStack *&a,SqStack *&b,SqStack *&c) { static int i=0; if(n==1) { Move(a,c); i++; }
动画演示:
A
B
C
动画演示:
A
B
C
动画演示:
A
B
C
动画演示:
A
B
C
动画演示:
A
B
C
动画演示:
A
B
C
动画演示:
A
B
C
百度文库
动画演示:
A
B
C
动画演示:
A
B
C
动画演示:
A
B
C
动画演示:
A
B
C
动画演示:
A
B
C
开始
汉 诺 塔 流 程 图
输入盘数

判定盘数是否为1

盘子数量大于 1, 继续进行递归过程

printf("请输入汉诺塔中圆盘的个数: "); scanf("%d",&n); for(int t=n;t>0;t--) Push(a,t); printf("步骤如下:\n\n"); i=Hanoi(n,a,b,c); DestroyStack(a); DestroyStack(b); DestroyStack(c); printf("总共需要移动的次数为:%d次\n",i); }
Move(A,C) (4) Hanio (1,C,A,B) Move(A,B) (5) Move (C,B)
汉 诺 塔 递 归 图
Hanio(3,A,B,C)
Hanio(1,B,C,A) Move(A,B) Hanio(2,B,A,C) (14) (8) Hanio(1,B,C,A) Move(B,C) Hanio(2,B,A,C) Hanio(1,A,B,C,) (13) Move(A,C) (12) (11) (10) Hanio(1,A,B,C,) (9) Move(B,A)
• 功能描述:
• • • • • • • • • • • • • InitStack(SqStack *&s) { s->top=-1构造一个空栈; 构造一个空栈s; } Push(SqStack *&s,int e) { if(栈满) 存储分配失败; else 插入元素e为新的栈顶元素; } Pop(SqStack *&s,int &e) /*初始化栈*/
• 设计分析:
• (1)该问题涉及递归调用问题,同时要求运用 栈的知识; (2)对于栈的递归调用;

• (3)而对于栈的应用,主要是其基本 • 操作:栈的建立、初始化、进栈、出 • 栈、销毁栈。
• 实验目的:
• (1)掌握栈的特点; • (2)掌握栈的常见算法以及程序实现;
• (3)了解递归的工作过程。
输出移动步骤
执行移位操作
执行移位操作
输出移动步骤
结束

递归第二层 Hanio(2,A,C,B) (3) 递归第一层 (2) Hanio (3,A,B,C) (1) Hanio (2,A,C,B) (7) Hanio (1,C,A,B) (6) Hanio(1,A,B,C)
递归第三层 Hanio(1,A,B,C)
•汉诺塔程序设计报告
第四组
• 基本思想:
• 汉诺塔是典型的递归程序设计题。 • • 设要解决的的汉诺塔共有n个圆盘,对A塔上的全 部n个圆盘从小到大顺序编号,最小 • 的圆盘为1号,次之为2号,依次类 • 推,则最下面的圆盘的编号为n。
• 第一步: • 先将问题简化。假设A杆上只有一个圆盘,即汉 诺塔只有一层n=1,则只要将1号盘从A塔上移 到C塔上即可。 • 第二步: • 对于一个有n(n>1)个圆盘的汉诺塔,将n个圆 盘分成两部分:上面的n-1个圆盘和 • 最下面的N号圆盘。 • 第三步: • 将“上面的n-1个圆盘”看成一个 • 整体,为了解决n个圆盘的汉诺塔, • 需要借助B塔,移动n-1个盘移到B塔 • 上,移动第n个盘到C上,将B上n-1个 • 盘移到C上。
结果调试:
程序设计总结:
在本次有关汉诺塔问题的程序设计中,我们首先查 阅了相关书籍和资料,对本次设计的问题有了一个 整体的认识;然后进行了分工,各位同学分别在指 定的时间内完成了自己的工作;最后我们进行了汇 总和检验,修正了程序中明显的错误和报告中的瑕 疵。 这次的设计实验让我们深刻认识到了 查阅资料的必要性和团队协作的重要 性:前者让我们能够更加深入的了解 所要设计的问题,从而有一个清晰的 设计思路;后者则提高了课程设计完成 的效率,且保证了课程设计的质量。总 之,本次程序设计对我们的影响很大,意义深远。
相关文档
最新文档