数据结构 迷宫和栈 C语言

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAZESIZE 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define MAXSIZE 10
typedef int Status;

typedef struct 
{
	int cross;//行 
	int vertical;//列
		
}PosType; 
 
typedef struct 
{
	int ord;//通道快在路径上的序号 
	PosType seat;//通道块在迷宫上的坐标 
	int di;//此通道块往下一个通道块走的方向 
	
}SElemType;

typedef struct {
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;

typedef struct
{
	int arr[MAZESIZE][MAXSIZE];
	
}MazeType;//迷宫的地图 
//栈的初始化 
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 ClearStack(SqStack *S)
{
	S->top=S->base;
	return OK;
}

Status StackEmpty(SqStack S)
{
	return S.top==S.base?TRUE:FALSE;
}

int StackLength(SqStack S)
{
	return S.top-S.base;
}

Status GetTop(SqStack S,SElemType *e)
{
	if(S.top==S.base)
	return ERROR;
	*e=*(S.top-1);
	return OK;
}
//入栈 
Status Push(SqStack *S,SElemType 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++=e;
	return OK;
}
//出栈 
Status Pop(SqStack *S,SElemType *e)
{
		if(S->top==S->base)
		return ERROR;
	    *e=*--S->top;
		return OK;
}
//打印栈内容,也就是迷宫的路线 
void StackPrint(SqStack S)
{
	int i;
	for(i=0;i<S.top-S.base;i++)
	{
		printf("Step NO.%-3d,[%d,%d],",S.base[i].ord,S.base[i].seat.cross,S.base[i].seat.vertical,S.base[i].di);
			switch(S.base[i].di)
			{
				case 1:
					printf("→.\n");
					break;
				case 2:
					printf("↓.\n");
					break;
				case 3:
					printf("←.\n");
					break;
				case 4:
					printf("↑.\n");
					break;
			}
	}

}

Status DestroyStack(SqStack *S)
{
	free(S->base);
	S->base = NULL;
	S->top = NULL;
	S->stacksize = 0;
	return OK;
}

//判断当前路径有没有走过,没有走过返回1,走过返回0 
Status Pass(MazeType myMaze,PosType curpos)
{
	if(myMaze.arr[curpos.cross][curpos.vertical]==1)//
		return 1;
	else
		return 0;
}
//判断下一步去哪里 
PosType NextPos(PosType CurPos,int Dir)
{
	PosType next;
	switch(Dir)
	{
		case 1://东 , 列+1,因为 a[列][行] ,比如从a[1][0]->走,就到了a[2][0] 
			next.cross=CurPos.cross;
			next.vertical=CurPos.vertical+1;
			break;
		case 2://南 
			next.cross=CurPos.cross+1;
			next.vertical=CurPos.vertical;
			break;
		case 3://西 
			next.cross=CurPos.cross;
			next.vertical=CurPos.vertical-1;
			break;
		case 4://北 
			next.cross=CurPos.cross-1;
			next.vertical=CurPos.vertical;
			break;	
	}
	return next;
}

Status MazePath(MazeType *maze,PosType start,PosType end)
{
	SqStack S;
	PosType curpos;
	int curstep;
	SElemType e;
	
	InitStack(&S);
	curpos=start;
	curstep=1;
	do
	{
		if(Pass(*maze,curpos))//判断以前走过没有 
		{
			maze->arr[curpos.cross][curpos.vertical]=2;//从此路经过,将地图此点标记为2
			e.di=1;
			e.ord=curstep;
			e.seat=curpos;
			Push(&S,e);//将走过的路压栈 
			if(curpos.cross==end.cross&&curpos.vertical==end.vertical)//到达终点 
			{
				StackPrint(S);//打印路径 
				return OK;
			}
			curpos=NextPos(curpos,1);
			curstep++;
		}
		else
		{
			if(!StackEmpty(S))//栈不为空 
			{
				Pop(&S,&e);
				while(e.di==4&&!StackEmpty(S))//此点4个方向都走过了 
				{
					maze->arr[e.seat.cross][e.seat.vertical]=-1;//此路不通,标记为-1 
					Pop(&S,&e);//出栈 
				}
				if(e.di<4)//此点还有方向没有探索 
				{
					e.di++;
					Push(&S,e);
					curpos=NextPos(e.seat,e.di);
				}
			}
		}
	}while(!StackEmpty(S));
	return ERROR;
}

void main()
{
	int i,j;
	PosType s,e;
	/*int tu[10][10]={
	0,0,0,0,0,0,0,0,0,0,
	0,1,0,0,1,1,1,0,1,0,
	0,1,0,1,1,1,1,0,1,0,
	0,1,1,1,0,1,0,1,1,0,
	0,0,1,0,0,1,1,1,1,0,
	0,1,1,1,0,1,1,1,1,0,
	0,1,0,1,1,1,0,1,1,0,
	0,1,0,0,0,1,0,0,1,0,
	0,0,1,1,1,1,1,1,1,0,
	0,0,0,0,0,0,0,0,0,0,
	};*/
	int tu[10][10]={0};//
	MazeType maze;
	
	srand((unsigned int)time(NULL));
	while(1)
	{
			for(i=1;i<9;i++)
		{
			for(j=1;j<9;j++)
			tu[i][j]=rand()%2+0;//随即生成0或1的数 
		} 
		tu[1][1]=1;
		printf("原来的迷宫:\n");
		for(i=0;i<10;i++)
		{
			for(j=0;j<10;j++)
			{
			printf("%-3d",tu[i][j]);
			}
			printf("\n");
		} 

		for(i=0;i<10;i++)
		for(j=0;j<10;j++)
		{
			maze.arr[i][j]=tu[i][j];
		}
		//为起点赋值 
		s.cross=1;
		s.vertical=1;
		//为终点赋值 
		e.cross=8;
		e.vertical=8;
		
		if(!MazePath(&maze,s,e))
			printf("无解\n");
		else
			{
				printf("修改后的迷宫:\n");//标记后的迷宫 
				for(i=0;i<10;i++)
				{
					for(j=0;j<10;j++)
					{
					printf("%-3d",maze.arr[i][j]);
					}
					printf("\n");
				} 
				break;
			}
		
		system("CLS");//如果随即生成的迷宫无解就清屏继续生成 
	}
}








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值