您的位置:首页 > 理论基础 > 数据结构算法

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

2014-03-04 18:44 579 查看
前面有一篇是深度优先思想利用栈实现的迷宫路径,

感兴趣的朋友请进这里: 

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

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

基本思想是这样的:通过一个可行的点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("完成!");

}


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

下面是运行结果演示:





欢迎留言交流,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息