利用栈实现简单的求解迷宫程序

#include <stdio.h>
#include <malloc.h>
#include <string.h>

#define MAX				200
#define STACKINCREMENT	100
#define TRUE		1
#define FALSE		0

typedef struct _pos
{
	int x;
	int y;
}pos;

typedef struct _record
{
	pos p;
	int dic;
}rcd;

typedef rcd elemtype;
typedef int state;
typedef struct _stack
{
	elemtype *base;
	elemtype *top;
	int stacksize;
}stack;

state initStack(stack *s)
{
	s->base = (elemtype *)malloc(sizeof(elemtype) * MAX);
	memset(s->base, 0, sizeof(elemtype) * MAX);
	s->top = s->base;
	s->stacksize = MAX;
	return TRUE;
}

state destroyStack(stack *s)
{
	free(s->base);
	return TRUE;
}

state clearStack(stack *s)
{
	s->top = s->base;
	return TRUE;
}

state StackEmpty(stack *s)
{
	return (s->top == s->base) ? TRUE : FALSE;
}

state Push(stack *s, elemtype x)
{
	if((s->top - s->base) >= s->stacksize)
	{
		s->base = (elemtype *)realloc(s->base, s->stacksize + STACKINCREMENT);
		s->top = s->base + s->stacksize;
		s->stacksize += STACKINCREMENT;
		return FALSE;
	}

	*s->top++ = x;
	return TRUE;
}

state Pop(stack *s, elemtype *x)
{
	if(s->top == s->base)
	{
		printf("栈空\n");
		return FALSE;
	}
	*x = *--s->top;
	return TRUE;
}

state GetTop(stack *s, elemtype *x)
{
	if(s->top == s->base)
	{
		printf("栈空\n");
		return FALSE;
	}
	*x = *(s->top - 1);
	return TRUE;
}

#define N	10
int puzzle[N][N] = {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
					{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
					{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
					{1, 0, 0, 0, 0, 1, 1, 0, 0, 1},
					{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},
					{1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
					{1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
					{1, 0, 1, 1, 1, 0, 1, 1, 0, 1},
					{1, 1, 0, 0, 0, 0, 0, 0, 0, 1},
					{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};

void printPuzzle()
{
	int i;
	int j;
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			if(puzzle[i][j] == 1)
			{
				printf("#");
			}
			else if(puzzle[i][j] == 2)
			{
				printf("*");
			}
			else if(puzzle[i][j] == 3)
			{
				printf("@");
			}
			else
			{
				printf(" ");
			}
		}
		printf("\n");
	}
}

state isEnd(pos *a, pos *b)
{
	if(a->x == b->x && a->y == b->y)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

state printFoot(pos *a)
{
	puzzle[a->x][a->y] = 3;
	return TRUE;
}

state accessPos(pos *a)
{
	return (puzzle[a->x][a->y] == 0) ? TRUE : FALSE;
}

void changePos(rcd *p, rcd *dst)
{
	p->dic++;
	dst->dic = 0;
	switch(p->dic)
	{
	case 0://右
		dst->p.x = p->p.x;
		dst->p.y = p->p.y + 1;
		break;
	case 1://下
		dst->p.x = p->p.x + 1;
		dst->p.y = p->p.y;
		break;
	case 2://左
		dst->p.x = p->p.x;
		dst->p.y = p->p.y - 1;
		break;
	case 3://上
		dst->p.x = p->p.x - 1;
		dst->p.y = p->p.y;
		break;
	default:
		printf("pos error\n");
	}
}

int main()
{
	int i;
	int j;
	stack s;
	rcd cur;
	pos dst;
	rcd top;
	//终点
	dst.x = 8;
	dst.y = 8;
	//起点
	cur.p.x = 1;
	cur.p.y = 1;
	cur.dic = 0;

	initStack(&s);
	printPuzzle();
	while(!isEnd(&cur.p, &dst))//判断是否是终点
	{
		if(accessPos(&cur.p))//可以进入
		{
			printFoot(&cur.p);//留下足迹
			Push(&s, cur);
			cur.dic = 0;//走右侧位置
			cur.p.y++;
		}
		else
		{
			if(!StackEmpty(&s))
			{
				Pop(&s, &top);

				if(top.dic == 3)//四周都走过了
				{
					Pop(&s, &cur);
				}
				else
				{
					changePos(&top, &cur);//换一个方向
					Push(&s, top);
				}
			}
			else
			{
				break;
			}
		}
	}
	Push(&s, cur);
	while(!StackEmpty(&s))
	{
		Pop(&s, &cur);
		puzzle[cur.p.x][cur.p.y] = 2;
	}
	printPuzzle();
	destroyStack(&s);
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值