前面有一篇是深度优先思想利用栈实现的迷宫路径,
感兴趣的朋友请进这里:
算法基础(二):栈的应用--迷宫解题(超详细版!)
今天带来的是,用另一种数据结构--队列实现迷宫解题。简单的实现了下。
基本思想是这样的:通过一个可行的点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("完成!");
}
下面是运行结果演示:
欢迎留言交流,谢谢!