/**********************************************************************
题 目:
迷宫问题(栈与队列),(深度搜索,广度搜索)
[问题描述]
利用栈操作实现迷宫问题求解。
[基本要求]
(1)从文件中读取数据,生成模拟迷宫地图,不少于10行10列。
(2)给出任意入口和出口,显示输出迷宫路线。
开始日期:2019年12月25日
最后修改日期:2019年12月25日
***********************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#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 20
typedef int Status;
typedef struct
{
int x;
int y;
}position;
typedef position SElemType;
typedef struct
{
SElemType *base;//在栈构造之前和销毁之后,base的值为NULL
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
Status InitStack(SqStack &S)
//构造一个空栈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 DestroyStack(SqStack &S)
//初始条件:栈S已存在
//操作结果:栈S被销毁
{
S.top=NULL;
free(S.base);
S.stacksize=0;
return OK;
}
Status ClearStack(SqStack &S)
//初始条件:栈S已存在
//操作结果:将S清为空栈
{
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status StackEmpty(SqStack S)
//初始条件:栈S已存在
//操作结果:若栈S为空栈,则返回TRUE,否则FALSE
{
if(S.base==S.top)
return TRUE;
else
return FALSE;
}
Status StackLength(SqStack S)
//返回S的元素个数,即栈的长度
{
return S.top-S.base;
}
Status GetTop(SqStack S,SElemType &e)
//栈S存在且非空
//用e返回S的栈顶元素
{
if(S.top==S.base)
return ERROR;
e =*(S.top-1);
return OK;
}
Status Push(SqStack &S,SElemType e)
//栈S已存在
//插入元素e为新的栈顶元素
{
if((S.top-S.base==S.stacksize)||(S.top-S.base>S.stacksize))//栈满 追加空间
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT )*sizeof(SElemType));
if(!S.base)
return ERROR;//分配内存失败
S.top = S.base+S.stacksize;
S.stacksize=S.stacksize+STACKINCREMENT ;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e)
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR;
{
if(S.base==S.top)
return ERROR;
e=*(S.top-1);
S.top--;
return OK;
}
Status visit(SElemType e)
{
printf("%d\t",e);
return OK;
}
Status StackTraverse(SqStack S,Status (*visit)(SElemType e))
//栈S已经存在且非空
//从栈底到栈顶依次对S的每个元素调用visit(),一旦visit()失败,则操作失败。
{
if(S.base==S.top)
return ERROR;
while(!StackEmpty(S))
{
if(!visit(*(S.base)))
return ERROR;
S.base++;
}
return OK;
}
Status CreateFile(int m,int n)
{
char elem;
FILE *fp;
if((fp=fopen("maze_16.txt","w"))==NULL)
{
printf("->打开文件失败...\n");
exit(0);
}
srand(time(0)); // 产生一个随机种子
for(int x=1;x<=m;x++)
{
for(int y=1;y<=n;y++)
{
elem=48+rand()%2;
if(y!=n)
fprintf(fp,"%c ",elem);
else
fprintf(fp,"%c\n",elem);
}
}
fclose(fp);
return OK;
}
Status CreateMaze(char maze[MAXSIZE][MAXSIZE],int m,int n,SElemType &p,SElemType &out)
{
FILE *fp;
if((fp=fopen("maze_16.txt","r"))==NULL)
{
printf("->打开文件失败...\n");
exit(0);
}
int x,y;
char elem;
n=m;
printf("->迷宫矩阵的大小为:%d * %d\n", m, m);
for(x=1;x<=m;x++)
{
for(y=1;y<=n;y++)
{
if(y!=n)
fscanf(fp,"%c ",&maze[x][y]);
else
fscanf(fp,"%c\n",&maze[x][y]);
}
}
fclose(fp);
printf("->请给定出口及入口坐标:\n");
printf("->入口:");
scanf("%d%d",&x,&y);
maze[x][y]='0';
p.x=x;
p.y=y;
printf("->出口:");
scanf("%d%d",&x,&y);
maze[x][y]='0' ;
out.x=x;
out.y=y;
return OK;
}
Status Operate(int move[4][2],char maze[MAXSIZE][MAXSIZE],int m,int n,SElemType p,SElemType out)
//探路
{
SqStack S;
InitStack(S);
SElemType q;
// p.x=1;
// p.y=1;
Push(S,p);
maze[1][1]='.';
int flag=0;
int i=0;
int x,y;
//开始寻找出口
do
{
GetTop(S,p);
flag=0;
i=0;
while((flag==0) && (i<4))
{
x=p.x+move[i][0];
y=p.y+move[i][1];
if(maze[x][y]=='0')
{
p.x=x;
p.y=y;
Push(S,p);
maze[x][y]='.';
flag=1;
}
i++;
}
if(i==4)
{
maze[p.x][p.y]='*';
Pop(S,q);
// S.top--;
}
}while(!StackEmpty(S) && ((p.x!=out.x) || (p.y!=out.y)));
if(StackEmpty(S))
{
printf("->没有路径\n");
}
else
{
printf("\n->有路径\n");
}
printf("\n->探路踪迹:\n");
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
printf("%c",maze[i][j]);
printf("\n");
}
return OK;
}
Status PrintMaze(char maze[MAXSIZE][MAXSIZE],int m,int n)
{
printf("\n->原始迷宫:\n");
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
printf("%c",maze[i][j]);
printf("\n");
}
return OK;
}
int main()
{
int m=10,n=10;
SElemType p,out;
char maze[MAXSIZE][MAXSIZE];
int move[4][2]={{0,1},{1,0},
{0,-1},{-1,0}};
//CreateFile(m,n);
CreateMaze(maze,m,n,p,out);
PrintMaze(maze,m,n);
printf("->迷宫创建成功\n\n");
Operate(move,maze,m,n,p,out);
return 0;
}
```c
数据结构 K3.迷宫问题(栈与队列)(深度搜索,广度搜索)
最新推荐文章于 2022-10-15 17:05:30 发布