用c语言写一个迷宫程序,知道源码~ ~!
# include & ltstdlib.h & gt
#定义M 15
#定义编号15
Struct mark //定义迷宫中点的坐标类型。
{
int x;
int y;
};
Struct元素//“爱”栈元素,呵呵。。
{
int x,y;//x行,Y列
int d;//d下一个方向
};
Typedef结构LStack //链栈
{
元素elem
struct LStack * next
} * PLStack
/* * * * * * * * * * * *堆栈函数* * * * * * * * * * * * * *
int init stack(pl stack & amp;S)//构造一个空堆栈
{
S = NULL
返回1;
}
Int StackEmpty(PLStack S)//确定堆栈是否为空。
{
if(S==NULL)
返回1;
其他
返回0;
}
int Push(pl stack & amp;s,Element e)//按下新的数据元素。
{
pl stack p;
p =(pl stack)malloc(sizeof(LStack));
p->;elem = e;
p->;next = S;
s = p;
返回1;
}
int Pop(pl stack & amp;元素& ampE) //弹出栈顶元素。
{
pl stack p;
如果(!栈顶)
{
e = S-& gt;elem
p = S;
S = S-& gt;接下来;
免费(p);
返回1;
}
其他
返回0;
}
/* * * * * * * * * * * *找到迷宫路径函数* * * * * * * * * * * * * * * * * *
void MazePath(结构标记开始,结构标记结束,int maze[M][N],int diradd[4][2])
{
int i,j,d;int a,b;
元素elem,e;
S2 pl stack s 1;
init stack(s 1);
init stack(S2);
maze[start . x][start . y]= 2;//标记入口点。
elem . x = start . x;
elem . y = start . y;
elem . d =-1;//以-1开头
推送(S1,elem);
而(!StackEmpty(S1)) //堆栈不为空。有一条路要走。
{
Pop(S1,elem);
i = elem.x
j = elem.y
d = elem . d+1;//下一个方向
while(d & lt;4) //探索东南西北东南四面八方。
{
a = I+diradd[d][0];
b = j+diradd[d][1];
if(a = = end . x & amp;& amp& amp& amp迷宫[a][b]==0) //如果你到了出口,
{
elem . x = I;
elem . y = j;
elem.d = d
推送(S1,elem);
elem . x = a;
elem . y = b;
elem.d = 886//方向输出为-1判断是否到达出口。
推送(S1,elem);
Printf("\n0=东1=南2=西3=北886,然后走出迷宫\ n \ n路径为:(行坐标,列坐标,方向)\ n ");
While(S1) //反转序列,输出迷宫路径序列。
{
Pop(S1,e);
推(S2,e);
}
while(S2)
{
波普(S2,e);
printf("-& gt;(%d,%d,%d)",e.x,e.y,e . d);
}
返回;//跳出两层循环,本来用break,但是发现错误,exit会再次结束程序,所以还是选择return好。
}
If(maze[a][b]==0) //找到可以前进的非出口点。
{
迷宫[a][b]= 2;//标记这个点的经过
elem . x = I;
elem . y = j;
elem.d = d
推送(S1,elem);//当前位置是堆叠的。
I = a;//下一个点转换为当前点。
j = b;
d =-1;
}
d++;
}
}
Printf("没有找到走出这个迷宫的路径\ n ");
}
/* * * * * * * * * * * *建造迷宫* * * * * * * * * * * * * *
void int maze(int maze[M][N])
{
int i,j;
int m,n;//迷宫行,列[/M]
Printf("请输入迷宫中的行数m = ");
scanf("%d ",& ampm);
Printf("请输入迷宫中的列数n = ");
scanf("%d ",& ampn);
printf(" \n请输入迷宫的行和列:\ n用空格分隔,0代表路,1代表墙\ n ",m,n);
for(I = 1;我& lt= m;i++)
for(j = 1;j & lt= n;j++)
scanf("%d ",& ampmaze[I][j]);
Printf("你搭建的迷宫是(最外圈是坚固的)...\ n ");
for(I = 0;我& lt= m+1;I++) //添加围栏。
{
迷宫[I][0]= 1;
迷宫[I][n+1]= 1;
}
for(j = 0;j & lt= n+1;j++)
{
迷宫[0][j]= 1;
迷宫[m+1][j]= 1;
}
for(I = 0;我& lt= m+1;I++) //输出迷宫
{
for(j = 0;j & lt= n+1;j++)
printf("%d ",maze[I][j]);
printf(" \ n ");
}
}
void main()
{
int sto[M][N];
结构标记开始、结束;//入口和出口的起点、终点坐标
int add[4][2]={{0,1},{1,0},{0,-1},{-1,0 } };//行增量和列增量的方向是东、西、北、南[/M]
init maze(sto);//建造一个迷宫
Printf("输入入口的横坐标和纵坐标[逗号分隔]\ n ");
scanf("%d,%d ",& ampstart . x & amp;start . y);
Printf("横坐标输入输出,纵坐标[逗号分隔]\ n ");
scanf("%d,%d ",& ampend . x & amp;end . y);
MazePath(start,end,sto,add);//查找路径
系统(“暂停”);
}