#include<stdio.h>
#include<malloc.h>
#define M 15//M和N的值可以改,定义一个迷宫大小数组最大空间,
#define N 15
/*************栈函数****************/
typedef struct Seat//定义迷宫内点的坐标类型
{
int x;//x行,y列
int y;
};
typedef struct Element//链栈元素
{
Seat seat;//包含坐标(x,y)
int d;//记录方向(数字)
};
typedef struct Lstack//创建链栈单元素
{
Element elem;//链栈元素
Lstack *next;//下一个链栈地址
}*PLstack;
int Initstack(PLstack &S)//初始化空栈
{
S=NULL;
return true;
}
int StackEmpty(PLstack &S)//判断栈是否为空
{
if(S==NULL)
return true;
else
return false;
}
int Pop(PLstack &S,Element &e)//压入新数据元素
{
PLstack p;
if(!StackEmpty(S))
{
e=S->elem;
p=S;
S=S->next;
free(p);
return true;
}
else
return false;
}
int push(PLstack &S,Element e)//栈顶元素出栈
{
PLstack p;
p=(PLstack)malloc(sizeof(Lstack));
p->elem=e;
p->next=S;
S=p;
return true;
}
/*************建立迷宫*******************/
int Creatmaze(int maze[M][N]){
int m,n,i,j;//m,n迷宫行,列
printf("请输入要创建迷宫的行数m:");
scanf("%d",&m);
printf("请输入要创建迷宫的列数n:");
scanf("%d",&n);
printf("请创建%d行%d列迷宫(用空格隔开,0表示通道,1表示墙壁):\n",m,n);
for(i=1;i<m+1;i++)
for(j=1;j<n+1;j++)
scanf("%d",&maze[i][j]);
for(i=0;i<=m+1;i++)//加一圈围墙
{
maze[i][0]=1;
maze[i][n+1]=1;
}
for(j=0;j<=n+1;j++)
{
maze[0][j]=1;
maze[m+1][j]=1;
}
printf("你创建的迷宫如下:\n");//输出迷宫
for(i=0;i<=m+1;i++)
{
for(j=0;j<=n+1;j++)
printf("%d ",maze[i][j]);
printf("\n");
}
return true;
}
/***************求迷宫路径函数***********************/
int MazePath(Seat start,Seat end,int maze[M][N],int add[4][2])
{
int i,j,d,a,b;
char *direc[]={"East","South","West","Noth","Beybey"};
char **p;
Element elem,e;
PLstack S1,S2;
Initstack(S1);
Initstack(S2);
maze[start.x][start.y]=1;//入口点作上标记
elem.seat=start;
elem.d=-1;//开始为-1
push(S1,elem);
while(!StackEmpty(S1))//栈不为空 有路径可走
{
Pop(S1,elem);
i=elem.seat.x;
j=elem.seat.y;
d=elem.d+1;//下一个方向
while(d<4)//试探东南西北各个方向
{
a=i+add[d][0];
b=j+add[d][1];
if(a==end.x&&b==end.y&&maze[a][b]==0)//如果到了出口
{
elem.seat.x=i;
elem.seat.y=j;
elem.d=d;
push(S1,elem);
elem.seat=end;
elem.d=4;//方向输出为拜拜 判断是否到了出口
push(S1,elem);
printf("\n通路为:(行坐标,列坐标,方向)\n");
while(S1)//逆置序列 并输出迷宫路径序列
{
Pop(S1,e);
push(S2,e);
}
while(S2)
{
Pop(S2,e);
p=direc+e.d;//将方向有数值转换为英文方向单词
printf("-->(%d,%d,%s)",e.seat.x,e.seat.y,*p);
}
printf("\n");//跳出两层循环,本来用break,但发现出错,exit又会结束程序,选用return
return true;
}
if(maze[a][b]==0)//找到可以前进的非出口的点
{
maze[a][b]=1;//标记走过此点
elem.seat.x=i;
elem.seat.y=j;
elem.d=d;
push(S1,elem);//当前位置入栈
i=a;//下一点转化为当前点
j=b;
d=-1;
}
d++;
}
}
printf("很遗憾:没有找到通道!\n");
}
void main()
{
Seat start,end;//start,end入口和出口的坐标
int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//行增量和列增量 方向依次为东西南北
int maze[M][N];
Creatmaze(maze);
printf("请输入迷宫入口坐标(逗号隔开):");
scanf("%d,%d",&start.x,&start.y);
printf("请输入迷宫出口坐标(逗号隔开):");
scanf("%d,%d",&end.x,&end.y);
MazePath(start,end,maze,add);//找通道
这是对网上一篇程序进行的升级,亮点是坐标表示更好,方向不再是数字而是英文方向单词更易于理解,希望对大家有帮助!