使用栈和队列实现迷宫路径查找算法

您所在的位置:网站首页 迷宫最短路径算法C语言用数组的方法 使用栈和队列实现迷宫路径查找算法

使用栈和队列实现迷宫路径查找算法

2023-07-15 05:38| 来源: 网络整理| 查看: 265

0 综述

最近,接到老板的一个小任务,即实现个迷宫路径查找小程序,要求使用栈和队列去实现。不敢怠慢,我赶紧打开Visual Studio 2012,同时在稿纸上笔画着。题目如下:使用栈及队列分别设计一个算法进行迷宫路径查找(用下列二维数组表示迷宫,1表示不可通过,0表示可以通过,左上角2为起点,右下角3为终点)。

1. 栈实现

    迷宫路径查找的关键点在于对分支点的处理,使用栈来存储分支点坐标的实现方法称之为深度搜索算法。对于初始矩阵,从初始点2开始搜索四个方向上的路径并分别对路径进行合理标记,然后在路径查找时可根据标记来输出查找到的路径。所以在查找过程中正确的标记方案将决定路径查找的效率及可行性。对于栈来说,可以采用如下标记策略:

按照题目中的值,2为起始点,3为终点,则令flag=4即下一个合理的路径节点权值从4开始。

规则一:对于当前节点,只有唯一路径出口的保持权值不变,即将出口节点权值标记为当前节点的权值,如图中(起始点权值为4)flag 5,6,7。

规则二:将分支点压入栈,每次出栈的点在原有权值基础上加1,如4节点有三个出口被压入栈,5为第一个出栈的,6为第二个出栈的。

按照如上规则标记权值,搜索路径时可根据从起点按照上下左右四个路径查找权值最大的点作为路径下一个节点,即可找查找到最终路径(2-4-6-7-3)。

2. 队列实现

    使用队列来存储分支点坐标的实现方法称之为广度搜索算法。和上述栈的查找方法不同之处在于,标记策略的不同。对于队列来说,可以采用如下标记策略:

按照题目中的值,2为起始点,3为终点,和上述栈一致,从4开始标记路径。

规则一:对于同一级别的广度搜索节点采用统一的权值。

规则二:记录同一级别点的个数,当进入下一级别队列时,权值加1。

按照如上规则标记权值,搜索路径时可采用逆向搜索方法即从终点前向搜索并选取邻近节点权值最小作为下一个路径有效节点(3-9-8-7-6-5-4-2)。

3. 实现代码与结果演示

/* ========================================================= * 迷宫路径搜索算法 * ========================================================= * 20141203 */ #include #include #include #include #include using std::cout; using std::endl; using std::stack; using std::queue; #define N 15 typedef struct{ int x; int y; }PointPos; int map[15][15] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 }, { 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1 }, { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 }, { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 }, { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1 }, { 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 }, { 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 }, { 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }; /* ========================================================= * 函数声明 * ========================================================= */ // 搜寻起始点和终点坐标函数 void FindMarkedPos(PointPos& start,PointPos& end); // 恢复map初始数据函数 void InitMap(); // 基于Stack的深度优先搜索算法 void UseStack(PointPos start,PointPos end); // 基于Queue的广度优先搜索算法 void UseQueue(PointPos start,PointPos end); // Stack结果输出函数 void StackOutPut(PointPos start); // Queue结果输出函数 void QueueOutPut(PointPos start); /* ========================================================= * 主函数 * ========================================================= */ void main(void) { // 其实结束标记点定义 PointPos start,end; // 寻找标记点函数 FindMarkedPos(start,end); // Stack深度优先搜索函数 UseStack(start,end); // 输出 Stack深度优先搜索的结果 cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3