2021-09-17

                   ****纯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之类都是比较好用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值