汉诺塔问题(递归和非递归算法)

//递归算法
#include<stdio.h>
void hanoi(int n,char a,char b,char c)
{
	if(n==1)printf("盘号:%d,%c-->%c\n",n,a,c);
	//递归初始条件
	if(n>=2)
	{
		hanoi(n-1,a,c,b);//将这n-1个盘看作是一个“整体”,此时“n=1”从A移向B
		printf("盘号:%d,%c-->%c\n",n,a,c);//将盘号为n的盘从A移向C
		hanoi(n-1,b,a,c);//将这n-1个盘看作是一个“整体”,此时“n=1”从B移向C
	}
}

void main()
{
	int n;char a='A',b='B',c='C';
	printf("请输入圆盘的总个数n:");
	scanf("%d",&n);
	hanoi(n,a,b,c);
}
//非递归算法(堆栈实现)
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
	int n;
	char a,b,c;
	int flag;
}ElemTp;

typedef struct
{
	ElemTp *elem;
	int max_size;
	int top;
}SqStack;

void main()
{
	void createStack(SqStack &s,int n);
	void push(SqStack &s,int n,char a,char b,char c,int flag);
	int n;
	ElemTp x,y;
	scanf("%d",&n);
	SqStack s;
	createStack(s,n);
	push(s,n,'A','B','C',0);
	while(s.top>=0)
	{
		x=s.elem[s.top];
		if(x.n==0||x.flag==2)
		{
			s.top--;
			s.elem[s.top].flag++;
		}
		else if(x.flag==0)
			push(s,x.n-1,x.a,x.c,x.b,0);
		else
		{
			printf("盘号:%d,%c-->%c\n",x.n,x.a,x.c);
			push(s,x.n-1,x.b,x.a,x.c,0);
		}
	}
}
void createStack(SqStack &s,int n)
{
	s.max_size=n+1;s.top=-1;
	if(!(s.elem=(ElemTp*)malloc(s.max_size)))exit(-1);
}

void push(SqStack &s,int n,char a,char b,char c,int flag)
{
	ElemTp x={n,a,b,c,flag};
	if(s.top>=s.max_size-1)exit(-1);
	s.elem[++s.top]=x;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值