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