算法基础(六):广度优先探索迷宫路径(队列实现!)—超详细版!
2014-03-04 18:44
579 查看
前面有一篇是深度优先思想利用栈实现的迷宫路径,
感兴趣的朋友请进这里:
算法基础(二):栈的应用--迷宫解题(超详细版!)
今天带来的是,用另一种数据结构--队列实现迷宫解题。简单的实现了下。
基本思想是这样的:通过一个可行的点A,向其周围探索,得到其他可行的点B(i),并加入队列,B(i)的前驱便是A。这样循环下去,直到找到终点。
然后通过前驱关系,输出路径。这便是老师口中说的floodfill算法,图中所有的空格都会走一遍。和之前用栈实现的不同,那是深度优先,一条路走到底,不行退回来,走另外一条,直至找到终点。
下面给出代码:
其中几个头文件,我在之前的几篇文章中给出过。
下面是运行结果演示:
欢迎留言交流,谢谢!
感兴趣的朋友请进这里:
算法基础(二):栈的应用--迷宫解题(超详细版!)
今天带来的是,用另一种数据结构--队列实现迷宫解题。简单的实现了下。
基本思想是这样的:通过一个可行的点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("完成!"); }
其中几个头文件,我在之前的几篇文章中给出过。
下面是运行结果演示:
欢迎留言交流,谢谢!
相关文章推荐
- 广度优先搜索迷宫路径算法的实现
- 迷宫最短路径的C++实现(队列:广度优先)
- 迷宫最短路径的C++实现(队列:广度优先)
- c++ 使用广度优先算法走迷宫并标记路径
- 使用栈和队列实现迷宫路径查找算法
- 广度优先搜索--迷宫最短路径--队列
- 广度优先搜索-迷宫问题(算法基础 第8周)
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 深度优先搜索迷宫路径算法的实现
- 利用广度优先遍历(BFS)计算最短路径 - Java实现
- 广度优先收索实现迷宫问题
- BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题
- MATLAB实现寻路、布线、迷宫的递归深度优先遍历算法_动画演示
- 图的深度优先和广度优先遍历及两点间最优路径实现
- [二叉树专题]:广度优先:按层次遍历二叉树的非递归实现||使用队列实现层次遍历二叉树
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 队列实现求迷宫最短路径(包含每一步的尝试状态,迷宫随机生成)
- 深度、广度优先遍历算法C实现