深度优先搜索DFS求解迷宫问题

找到迷宫的可行路径的坐标,这是一个搜索遍历问题。

实现思路:

可行的路径保存在路径向量P中,从当前点寻找可行方向,如果可行则next入栈,不行则出栈退回前一点。

搜寻可行路径的代码:

 while (!P.empty()){if (P.back().direction < d)//d是方向个数,表示可行{point next= {    P.back().pt.x+delta[P.back().direction].x,P.back().pt.y + delta[P.back().direction].y };//下一个点++P.back().direction;if (maze[next.x][next.y] == unvisited)//未被访问{maze[next.x][next.y] = visited;P.push_back({ next,0 });//放进路径里if (next.x == destination.x&&next.y == destination.y)//到达终点break;}}elseP.pop_back();//,点无路可走时,出栈返回上一个点}

坐标轴:假定朝下为x轴正方向,朝右为y轴正方向

这里可以移动方向分为上下左右四种(d=4)情况,它们相对于当前点的方向偏移量如下:
右:{0,1}
下:{1,0}
左:{0,-1}
上:{-1,0}
构成方向向量:以下标取值0, 1, 2, 3标记右,下,左,上与当前点的偏移量.
point delta[d]={{0,1},{1,0},{0-1},{-1,0}};
举例子:delta[0]表示向右走,delta[1]表示向下走。
下个点next表示为:当前点的位置坐标+偏移量

 point next= {  P.back().pt.x + delta[P.back().direction].x,P.back().pt.y + delta[P.back().direction].y };//下一个点

完整代码:

#include"pch.h"
#include <iostream>
#include <vector>using namespace std;//点坐标
struct point {int x;int y;
};
//状态:点坐标+方向
struct status {point pt;int direction;  // 以direction取值0, 1, 2, 3标记东南西北.
};int main()
{const int m = 5;const int n = 7;char maze[m][n] = { {'*','*','*','*','*', '*','*'},{'*','0','*', '0','0','0','*'},{'*','0','*', '0','*','0','*'},{'*','0','0', '0','*','0','*'},{'*','*','*', '*','*','*','*'}};const char visited = 'V';//访问过的标记const char unvisited = '0';//未访问过的标记//可行的方向数目0,1,2,3分别代表东南西北方向和当前位置的偏移量const int  d = 4;const point delta[d] = { {0,1},{1,0},{0,-1},{-1,0}};//起点和终点坐标point source = { 1,1 };point destination = {3,5};vector<status> P;//搜索时保存路径所用的向量,可视为栈;P.reserve(m*n);//提前预留容量;P.push_back({ source,0 });//设定初始位置,并设定初始方向;maze[source.x][source.y] = visited;//起点定为已经访问while (!P.empty()){if (P.back().direction < d)//方向可取d是方向个数{point next= {  P.back().pt.x+delta[P.back().direction].x,P.back().pt.y + delta[P.back().direction].y };//下一个点++P.back().direction;if (maze[next.x][next.y] == unvisited)//未被访问{maze[next.x][next.y] = visited;P.push_back({ next,0 });//放进路径里if (next.x == destination.x&&next.y == destination.y)//到达终点break;}}elseP.pop_back();//,点无路可走时,出栈返回上一个点}cout << "迷宫图如下:" << endl;
//print the mazefor (size_t i = 0; i < m; ++i)for (size_t j = 0; j < n; ++j){cout << maze[i][j];if (j == n - 1)cout << endl;}
//打印路径cout << "可行坐标路径为:" << endl;for (const auto& c : P)cout << c.pt.x << " " << c.pt.y << endl;return 0;
}

测试结果:

栈的应用_DFS解迷宫问题相关推荐

  1. 用栈、回溯算法设计迷宫程序

    目录 1.走迷宫与回溯算法 2.迷宫设计栈扮演的角色 3.Python实现走迷宫 栈的应用有许多,本篇博文着重将栈与回溯(Backtracking)算法结合,设计走迷宫程序.其实回溯算法也是人工智能的 ...

  2. 用python深度优先遍历解迷宫问题

    这篇文章主要给大家介绍了关于python迷宫问题深度优先遍历的相关资料,深度优先搜索算法(Depth-First-Search),是搜索算法的一种,需要的朋友可以参考下 一.迷宫介绍 用python解 ...

  3. c++:栈的基本操作+实例:迷宫求解

    栈的基本操作+实例:迷宫求解 #include<iostream> using namespace std;struct Node {int datai;int dataj;Node* n ...

  4. C/C++堆、栈及静态数据区详解

    五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.下面分别来介绍: 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面 ...

  5. 堆、栈及静态数据区详解

    堆.栈及静态数据区详解 五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储 ...

  6. leetcode84- 柱状图中最大的矩形(三种思路:暴力,单调栈+哨兵(详解),分治)

    leetcode84- 柱状图中最大的矩形(三种思路:暴力,单调栈+哨兵(详解),分治) 介绍 题目 解题思路 解法一:暴力向两边搜索 解法二:单调栈 画图演示 宽度计算: 解法三:单调栈+哨兵 解法 ...

  7. java版数据结构解迷宫问题_C语言数据结构之迷宫问题

    本文实例为大家分享了数据结构c语言版迷宫问题栈实现的具体代码,供大家参考,具体内容如下 程序主要参考自严蔚敏老师的数据结构c语言版,在书中程序的大体框架下进行了完善.关于迷宫问题的思路可查阅原书. # ...

  8. 数据采集标注、模型开发、部署落地,百度大脑全栈 AI 能力详解

    AI 时代已来,软硬件解决方案企业在智能化转型过程中,面临着技术投入成本高.研发周期长等挑战.如何借助业内成熟技术.快速低成本地实现 AI 应用,已成为企业自身与技术平台特别关注的问题. 从核心技术能 ...

  9. 新IT运维模式下,全栈溯源助你解应用性能监控难题

    [51CTO.com原创稿件]2016年,Gartner对APM的定义将原来的五个维度定义修改成了三个维度,即:数字化体验监控(DEM),应用发现.追踪和诊断(ADTD),以及应用分析(AA).此外, ...

最新文章

  1. php layui实现添加input,Layui实现input输入和选择的方法
  2. 使用SAP云平台portal service之前,需要做好哪些准备
  3. 【阿里内部应用】基于Blink为新商业调控打造实时大数据交互查询服务
  4. 分布式存储系统设计 - Gossip
  5. 数据库---主要约束操作讲解
  6. Mysql —— 索引的使用顺序
  7. 架构师必备之最全最系统的 Android 界面性能调优资料
  8. python画图程序没有图_Python实现画图软件功能方法详解
  9. 为织梦cms列表页文章缩略图添加alt属性的方法
  10. 正高、正常高、大地高
  11. 快光慢光的产生原理及群速度相速度的定义
  12. 机器学习系列5---偏差和方差分解
  13. Splines(样条曲线)
  14. 关于骨骼(Skeleton)、绑定(Rigging)、蒙皮(Skinning)、刷权重(Weight Painting)那些事儿(9月3日 更新)
  15. Connect Four四子棋c++程序 - 显示窗口(0)
  16. 人间哪知星空遥:荣耀30系列的巡天计划
  17. 黑客突破防火墙常用的几种技术(转)
  18. 如何做好积分商城运营?
  19. 微信小程序开发笔记6——小程序添加并使用外部字体(亲测可用)
  20. 《使用第三方库来显示jpeg图片》

热门文章

  1. Siliverlight和xap客户端一起捆绑安装包制作方法
  2. set在python中什么意思_python中set是什么意思
  3. 24小时临时邮箱_免费临时邮箱和接码平台
  4. linux驱动程序是什么,简述一个Linux驱动程序的主要流程与功能
  5. 【UGV】Mec 麦轮版小车驱动程序示例
  6. 【UWB】公式推导计算坐标值
  7. Android system server之PackageManagerService详细分析
  8. deepin终端配置为英文
  9. 2.Vivado软件基础操作
  10. 一、烧写最小linux系统