递归算法
#include<stdio.h>
#include"time.h"
static int c=0;
void move(char x,int n,char z)
{//移动函数
printf("第%d步: 将第%i个盘子从%c 盘移动到%c \n",++c,n,x,z);
}
void hanoi(int n,char x,char y,char z)
{汉诺塔递归函数
if(n==1)
move(x,1,z);
else
{
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
}
}
int main()
{
int n;
time_t start,end;
printf("请输入圆盘的个数: ");
scanf("%d", &n);
start=time(NULL);//计算时间开始
hanoi(n,'A','B','C');
end=time(NULL);//计算时间结束
printf("time = %f seconds\n",difftime(end,start));
return 0;
}
非递归
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include"time.h"
#define TRUE 1
#define FALSE 0
#define YES 1
#define NO 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int SElemType;
typedef int Status;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 20
int count;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack *s)
{
s->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!s->base)
{
exit(OVERFLOW);
}
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
Status GetTop(SqStack *s,SElemType *e)//判断栈是否为空,不为空返回栈顶元素
{
if(s->top == s->base)
{
return ERROR;
}
*e = *(s->top-1);
return OK;
}
Status StackEmpty(SqStack *s) //判断栈是否为空
{
if(s->top == s->base)
return TRUE;
else
return FALSE;
}
Status Push(SqStack *s,int n,SElemType x,SElemType y,SElemType z)//压栈函数,插入元素e为新的栈顶元素
{
if(s->top - s->base >= s->stacksize)
{
s->base = (SElemType *)realloc(s->base,(s->stacksize + STACKINCREMENT)*sizeof(SElemType));
if(!s->base) exit (OVERFLOW);
s->top = s->base + s->stacksize;
s->stacksize += STACKINCREMENT;
}
*s->top ++ = n; //顺序压栈
*s->top ++ = x;
*s->top ++ = y;
*s->top ++ = z;
return OK;
}
Status Pop(SqStack *s,int *n,SElemType *x,SElemType *y,SElemType *z) //若栈不为空,则删除s的栈顶元素,用e返回其值。
{
if(s->top == s->base)
return ERROR;
*z = * --s->top; //逆序出栈
*y = * --s->top;
*x = * --s->top;
*n = * --s->top;
return OK;
}
void Move(SElemType x,int n,SElemType z)
{
printf("%d: move disk %d from %d to %d\n", ++count, n, x, z);
}
void hanoi(SqStack *s, SElemType n,SElemType x,SElemType y,SElemType z)
{
Push(s,n,x,y,z);
while (!StackEmpty(s)) //栈非空
{
Pop(s,&n,&x,&y,&z);
if ((y==-1)||(n ==1))
Move(x, n, z); //不需要y或只剩1号盘
else
{ Push(s,n-1,y,x,z);
Push(s,n,x,-1,z);
Push(s,n-1,x,z,y);
}
}
}
int main()
{
int n;
time_t start,end;
SqStack s;
InitStack(&s);
printf("请输入汉诺塔的层数N:");
scanf("%d",&n);
start=time(NULL);//计算时间开始
hanoi(&s,n,1 ,2 ,3);
end=time(NULL);//计算时间结束
printf("time = %f seconds\n",difftime(end,start));
return 0;
}