编写递归函数实现汉诺塔问题:在移动过程中可以利用B座,要求打印移动的步骤.

编写递归函数实现汉诺塔问题:在移动过程中可以利用B座,要求打印移动的步骤.
汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上.有一个和尚想把这n个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上.在移动过程中可以利用B座,要求打印移动的步骤.
老刀不宝 1年前 已收到1个回答 举报

caojun_6727 春芽

共回答了20个问题采纳率:90% 举报

#include
#include
#define MaxSize 4
typedef int ElemType;
typedef struct
{
x05ElemType data[MaxSize];
x05int top;char name;
}SqStack;
void InitStack(SqStack * &s,char b) //初始化栈
{
x05s=(SqStack *)malloc(sizeof(SqStack));
x05s->top=-1;s->name=b;
}
void ClearStack(SqStack * &s) //销毁栈
{
x05free(s);
}
void CreateStack(SqStack * &s) //创建栈
{
x05int A[MaxSize],i;
x05for(i=0;itop++;
x05x05s->data[s->top]=A[i];
x05}
}
int Pop(SqStack * &s,ElemType &e) //出栈
{
x05if(s->top==-1)
x05x05return 0;
e=s->data[s->top];x05
x05s->top--;
x05return 1;
}
int Push(SqStack * &s,ElemType e) //进栈
{
x05if(s->top==MaxSize-1)
x05return 0;
x05s->top++;
s->data[s->top]=e;
x05return 1;
}
void DispStack(SqStack *s) //显示栈中元素
{
x05for(int i=s->top;i>=0;i--)
x05x05printf("%d ",s->data[i]);
x05printf("n");
}
void Move(SqStack * &A,SqStack * &B) //将栈A的栈顶元素移动到栈B
{
x05ElemType e;
Pop(A,e);
x05Push(B,e);
}
void Hanoi(int n,SqStack *A,SqStack *B,SqStack * &C) //汉诺塔算法
{char e;
x05if(n==1) {Move(A,C);
x05printf("将第%d个碟子从%c移到%c上n",A->data[A->top+1],A->name,C->name);
x05}
x05else{
x05x05Hanoi(n-1,A,C,B);
x05x05Move(A,C);
x05x05printf("将第%d个碟子从%c移到%c上n",A->data[A->top+1],A->name,C->name);
x05x05Hanoi(n-1,B,A,C);
x05}
}
void main()
{
x05SqStack *A,*B,*C;
x05InitStack(A,'A') ;
x05InitStack(B,'B') ;
x05InitStack(C,'C') ;
x05CreateStack(A);
x05printf("A栈中元素从栈顶到栈底依次为:");
x05DispStack(A);
x05Hanoi(MaxSize,A,B,C);
x05printf("C栈中元素从栈顶到栈底依次为:");
x05DispStack(C);
x05ClearStack(A);
x05ClearStack(B);
ClearStack(C);
}

1年前

5
可能相似的问题
Copyright © 2024 YULUCN.COM - 雨露学习互助 - 17 q. 0.926 s. - webmaster@yulucn.com