****纯c的深度优先算法实现迷宫maze****
学习数据结构的时候学到了深度优先算法,众所周知,深度优先算法用的是栈来记录路径,想用纯c语言去实现一下。
主体思想:
对于迷宫,首先是定义让迷宫不能走的地方设为1,能走的地方设为0,所以在这个算法中,我们的迷宫是一个二元数组,
利用深度优先算法,不断的试探,不能走的地方把0变成1,这样的让走不通的路不能走,当走到死路的时候,利用弹栈不断的回到原来的地方,更换方向去试触,通过继续压栈去继续记录走过的路,如此这般。
主要步骤:
1:定义好数据结构在头文件(顺序栈的出栈入栈等)
# include <stdlib.h> //malloc和free在这里面
# include <stdio.h> //for ,scanf,和while这种在这里面
# define ElemType int//暂时将这些elemtype变成这个int
//----------------------顺序栈---------
#define N 30 //迷宫的宽度
#define M 30 //迷宫的高度
#define MaxSize 100 //栈里面元素的最大数
typedef struct{
ElemType date [MaxSize];
int top;//栈顶指针,初始是如果设置S.top==-1,则进栈操作应该先指针加1,然后再送值到栈顶元素 ;反之如果弹栈则先取栈顶元素值,然后再将栈顶元素减1
}SqStack;
/* 栈空条件:S.top==-1; 栈满条件: S.top==MaxSize-1 (因为数组下标从0开始) 栈长:S.top+1 (具体情况具体分析)
基本运算:InitStack(&S):初始化一个空栈
StackEmpty(S):判断栈是否为空
Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶
Pop(&S,&x):入栈,若栈非空,则用x返回栈顶元素
GetStack(&S,&x):读栈顶元素,若栈非空,则用x返回栈顶元素 */
void InitStack(SqStack &S){
S.top=-1;
}
bool StackEmpty(SqStack S){
if(S.top==-1)
return true;
return false;
}
bool Push(SqStack &S,ElemType x){
if(S.top==MaxSize-1)
return false;
S.date[++S.top]=x; //S.top=-1开始时top指向这个栈顶元素,而如果S.top=0开始时top指向这个栈顶元素的下一个地址,则入栈S.date[S.top++]=x;
return true; //出栈则变为x=S.date[--S.top];
}
bool Pop(SqStack &S,ElemType &x){
if(S.top==-1)
return false;
x=S.date[S.top--];
return true;
}
bool GetStack(SqStack &S,ElemType &x){
if(S.top==-1)
return false;
x=S.date[S.top];
return true;
}
typedef struct{
//xy方向的增量
int iX,iY;//向下是x增加,向右是y增加
}Direction;
Direction d[4];
d[4]={{0,1}{1,0},{0,-1},{-1,1}}//定义顺序右下左上,同理可以定义八个方向
typedef struct{
int x,y; //当前访问的迷宫格子的纵横坐标
int f; //当前方向
}Kuai; //当前状态的信息,注意x轴向下,y轴向右,di在0123四方向
//新点被定义为(l,c) line和col*
//新点坐标是l=x+d[i].iX
// c=y+d[i].iY,获得新坐标f重置为零
```handlebars
2:寻路函数
bool path(int m[M+2][N+2],Direction d[],stack &S)//因为返回值是bool,所以要把路径返回,需要把栈给改掉
{ Kuai a; //存在栈中的元素
int x,y,d; //迷宫格子当前处理单元的纵横坐标和方向
int l,c;//迷宫格子的下一个的行坐标和列坐标,即试触点
m[1][1]=-1;//开始位置
a={1,1,-1} //伪代码执行不出的
s.push(a);
while(!isempty(s)
{ a=s.pop(); //回退
x=a.x; y=a.y; di=a.d+1
while(f<4) //尝试各个方向
{
l=x+d[f].iX;
c=y+d[f].iY;
if(m[l][c]==0)
{ a={x,y,f};
s.push(a);
x=l,y=c; m[l][c]=-1;
if(x==M&&y==N) return true; //迷宫有路
else f=0;//重新右下左上
}
}
else f++;//换个方向
}
}
最后自己去定义主函数去调用这个函数,输入的这个迷宫是用一个二元数组去指代。
主要的难点第一可能是当前坐标和试触坐标的不断更新,如何把不能走的路直接变成不走的路,即变成0,把方向变成一个结构体之类。当然也可以去找图形库去做到可视化,比如说easyx(小白),sdl(专用游戏库),SFML(2d更专业),qt之类都是比较好用的。