算法基础(六):广度优先探索迷宫路径(队列实现!)—超详细版!

前面有一篇是深度优先思想利用栈实现的迷宫路径,

感兴趣的朋友请进这里: 

算法基础(二):栈的应用--迷宫解题(超详细版!)

今天带来的是,用另一种数据结构--队列实现迷宫解题。简单的实现了下。

基本思想是这样的:通过一个可行的点A,向其周围探索,得到其他可行的点B(i),并加入队列,B(i)的前驱便是A。这样循环下去,直到找到终点。

然后通过前驱关系,输出路径。这便是老师口中说的floodfill算法,图中所有的空格都会走一遍。和之前用栈实现的不同,那是深度优先,一条路走到底,不行退回来,走另外一条,直至找到终点。

下面给出代码:

#include"Basic_Symbol.h"
#include"stdafx.h"
#include"ZJC_Queue.h"

/*
	广度优先探索迷宫路经(超详细版!)

*/
int MAP[9][9] =		/*二维数组就够用了,先从简单的地图开始*/
{  
   //0 1 2 3 4 5 6 7 8
	 
	 0,0,0,0,0,0,0,0,0,
	 0,1,0,0,1,1,1,1,0,
	 0,1,0,0,1,1,1,0,0,
	 0,1,1,1,1,0,1,1,0,
	 0,1,0,1,0,1,1,1,0,
	 0,1,0,1,0,1,0,0,0,
	 0,1,0,0,0,1,1,1,0,
	 0,0,0,1,1,1,0,1,0,
	 0,0,0,0,0,0,0,0,0,


};
void MAZH_SOLVE(int endx,int endy);
void print(LinkQueue Robot,QueuePtr EndPoint);			//打印路径
void AddtoQueue(int x,int y,LinkQueue &Robot,QNode *p); //把可以走的点加入到队列
int main()
{
	MAZH_SOLVE(7,7);
}

void MAZH_SOLVE(int endx,int endy)		//解决迷宫问题函数,参数为终点的坐标值
{
	 
	int dir;				//四个方向
	LinkQueue Robot;		//寻路机器人
	InitQueue(Robot);		//队列初始化
	
	Pos start;				//初始位置
	start.x = 1;
	start.y = 1;
	QElemType temp;
		
	
	printf("寻路开始...");
	InsertQueue(Robot,start);		//(1,1)入队	 
	QueuePtr tempPoint = Robot.front->next ;	
	printf("\nstart入队...");
	MAP[1][1] = 2;					//(1,1)标记为已走过										
	while(1)
	{		 
		temp = tempPoint->data;		//一个个取队列中元素,进行发散探索
		if(temp.x == endx && temp.y == endy)
		{			 
			printf("\n\n搞定!");
			break;					//找到到终点的路径了!完成
		}			 
		printf("开始判断各个方向..");
		for( dir = 0;dir<4;dir++)
		{
			switch(dir)				//对取得的元素进行四个方向探索!壮大我们的影分身队伍!
			{
			case 0:	AddtoQueue(temp.x,temp.y - 1,Robot,tempPoint);break;
			case 1:	AddtoQueue(temp.x + 1,temp.y,Robot,tempPoint);break;
			case 2:	AddtoQueue(temp.x,temp.y + 1,Robot,tempPoint);break;
			case 3:	AddtoQueue(temp.x - 1,temp.y,Robot,tempPoint);break;
			default:break;
			}					 
		}
		tempPoint = tempPoint->next;//取下一个		
	}	 
	print(Robot,tempPoint);			//打印路径
	 
}
void AddtoQueue(int x,int y,LinkQueue &Robot,QNode *p)
{
	 
	Pos temp;
	temp.x = x,temp.y = y;
	if(  MAP[temp.x][temp.y] == 1)	//可以走的,走过的标记2喔!	
	{
		printf("\n加入队列..x = %d, y = %d",x,y);
		InsertQueue(Robot,temp);
		Robot.rear->pre = p;
		MAP[temp.x][temp.y] = 2;
	}	 
}
void print(LinkQueue Robot,QueuePtr EndPoint)		
{	
	printf("\n寻路完成...");	 
	QueuePtr temp = EndPoint;
	Pos start;
	start.x = start.y = 1;	 	 
	printf("\n路径节点如下:x = %d, y = %d",temp->data.x,temp->data.y);
	do
	{				
		temp = temp->pre;		 
		printf("\n路径节点如下:x = %d, y = %d",temp->data.x,temp->data.y);		 
	}while(temp->data.x != 1 || temp->data.y != 1);				
	printf("完成!");

}

其中几个头文件,我在之前的几篇文章中给出过。

下面是运行结果演示:



欢迎留言交流,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值