#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");//如果随即生成的迷宫无解就清屏继续生成
}
}
数据结构 迷宫和栈 C语言
最新推荐文章于 2023-07-19 18:25:39 发布