数据结构迷宫升级版

数据结构迷宫升级版_第1张图片

#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);//找通道  

这是对网上一篇程序进行的升级,亮点是坐标表示更好,方向不再是数字而是英文方向单词更易于理解,希望对大家有帮助!


你可能感兴趣的:(数据结构,迷宫,fulinux)