迷宫寻路应该是栈结构的一个非常经典的应用了, 最近看数据结构算法应用时看到了这个问题, 想起来在校求学时参加算法竞赛有遇到过相关问题, 感觉十分亲切, 在此求解并分享过程, 如有疏漏, 欢迎指正

问题描述: 非常简洁明了的问题, 即对于一个由1,0构成的矩阵, 找到一条用0连接起来的从(1,1)到(10,10)的路径

思路: 用栈结构存储路径, 每经过一个点, 将点坐标存入栈, 并在矩阵中将此坐标点值置1, 循环直至找到点(10,10), 若中途没找到可以继续前进的点且栈为空, 则说明当前迷宫无解

代码如下:

 #include <iostream>
#include <stack> //坐标
typedef struct _struct_pos
{
_struct_pos()
{
x = ;
y = ;
} int x;
int y;
}Pos; //地图
int g_maze_arr[][] = {{,,,,,,,,,,,},
{,,,,,,,,,,,},
{,,,,,,,,,,,},
{,,,,,,,,,,,},
{,,,,,,,,,,,},
{,,,,,,,,,,,},
{,,,,,,,,,,,},
{,,,,,,,,,,,},
{,,,,,,,,,,,},
{,,,,,,,,,,,},
{,,,,,,,,,,,},
{,,,,,,,,,,,}}; //路径栈
std::stack<Pos> g_stack_path; /***************************************************************
*
*/
void print_pos(const Pos &pos)
{
std::cout << "[" << pos.x
<< "," << pos.y
<< "]" << std::endl;
} //检查出口
bool find_next(const Pos &curr_pos, Pos &next_pos)
{
//当前坐标
int x = curr_pos.x;
int y = curr_pos.y; //生成四个方向的坐标
Pos top, down, left, right;
top.x = x;
top.y = y - ;
down.x = x;
down.y = y + ;
left.x = x - ;
left.y = y;
right.x = x + ;
right.y = y; //判断四个方向有无通路
if (g_maze_arr[top.x][top.y] == )
{
next_pos.x = top.x;
next_pos.y = top.y;
std::cout << "find way : ";
print_pos(next_pos);
return true;
}
else if (g_maze_arr[down.x][down.y] == )
{
next_pos.x = down.x;
next_pos.y = down.y;
std::cout << "find way : ";
print_pos(next_pos);
return true;
}
else if (g_maze_arr[left.x][left.y] == )
{
next_pos.x = left.x;
next_pos.y = left.y;
std::cout << "find way : ";
print_pos(next_pos);
return true;
}
else if (g_maze_arr[right.x][right.y] == )
{
next_pos.x = right.x;
next_pos.y = right.y;
std::cout << "find way : ";
print_pos(next_pos);
return true;
}
else
{
std::cout << "no way find in :";
print_pos(curr_pos);
return false;
}
} //寻找路径
bool find_path()
{
Pos st_curr_pos, st_next_pos; //起点
st_curr_pos.x = ;
st_curr_pos.y = ;
g_maze_arr[][] = ; //不为终点坐标,继续查找路径
while ((st_curr_pos.x != ) || (st_curr_pos.y != ))
{
//找到下一路径
if (find_next(st_curr_pos, st_next_pos))
{
//记录下一个位置并置标记为1
g_stack_path.push(st_next_pos);
st_curr_pos = st_next_pos;
g_maze_arr[st_next_pos.x][st_next_pos.y] = ;
}
//无路可走
else
{
//路径栈为空,且无路可退,此迷宫无解
if (g_stack_path.empty())
{
return false;
}
//根据栈内信息,回退一步
else
{
st_curr_pos = g_stack_path.top();
g_stack_path.pop();
}
}
} return true;
} //输出路径
void print_path()
{
while (!g_stack_path.empty())
{
Pos st_curr_pos = g_stack_path.top(); std::cout << "[" << st_curr_pos.x
<< "," << st_curr_pos.y
<< "]" << std::endl; g_stack_path.pop();
}
}

测试如下:

结果

C++ 迷宫寻路问题的更多相关文章

  1. PTA7-1 迷宫寻路 (20分)

    7-1 迷宫寻路 (20分) 给定一个M行N列的迷宫图,其中 "0"表示可通路,"1"表示障碍物,无法通行.在迷宫中只允许在水平或上下四个方向的通路上行走,走过 ...

  2. NEFU 558 迷宫寻路

    题目链接 简单搜索题 #include <cstdio> #include <iostream> #include <cstring> using namespac ...

  3. HTML 迷宫

    今天补个遗,将很久以前研究 HTML5 的时候写的生成迷宫.迷宫寻路程序整理出来. 下载链接在文章最后. 简介 为什么要做这个 HTML5 迷宫程序?因为我喜欢.我愿意.也是向老程序员学习(见第5节) ...

  4. AI-随机迷宫&迷宫求解

    本文记录了,人工智能中简单的搜索策略中的路径搜索策略中的A*算法,来实现迷宫寻路的问题.(这只是一次本人的课外作业) 完整的程序源码已经发送到我的Git.这里只记录了我的思路和感想以及收获. 产生随机 ...

  5. 【转】A*寻路算法 C++实现

    头文件:AStarPathFinding #ifndef ASTARPATHFINDING_H #define ASTARPATHFINDING_H #include <queue>//为 ...

  6. PTA-迷宫寻路(输出最短路径)

    给定一个M行N列的迷宫图,其中 "0"表示可通路,"1"表示障碍物,无法通行.在迷宫中只允许在水平或上下四个方向的通路上行走,走过的位置不能重复走. 5行8列的 ...

  7. 用Java语言编写的迷宫小游戏软件

    可查看本项目的github 源码链接,撒娇打滚求 star 哦~~ღ( ´・ᴗ・ ` )比心 本仓库代码是经过 eclipse 编译运行过的,一般情况下将本仓库代码下载下来之后,使用 eclipse ...

  8. 【小白学游戏常用算法】二、A*启发式搜索算法

    在上一篇博客中,我们一起学习了随机迷宫算法,在本篇博客中,我们将一起了解一下寻路算法中常用的A*算法. 通常情况下,迷宫寻路算法可以使用深度优先或者广度优先算法,但是由于效率的原因,不会直接使用这些算 ...

  9. canvas——路径搜索

    在前一篇博客中随机生成迷宫,现在就以随机生成的迷宫为地图,开始寻找路径. 迷宫寻路也可以使用DFS,BFS,但常见的是A*算法,它是启发式搜索算法的一种,效率相比前两者也更高.接下来以A*算法为例,迷 ...

随机推荐

  1. iTOP-iMX6UL开发板-MiniLinux-CAN测试使用文档

    本文档介绍的是迅为iMX6UL开发板在 MiniLinux 系统环境下 iTOP-iMX6UL CAN 实验调试步骤.给用户提供了“can_libs.rar”.“can_tools.zip”和“can ...

  2. 吴裕雄--天生自然python学习笔记:python 文件批量查找

    在多个文本文件中查找 我们首先来学习文本文件的查找字符 . 我们通过 os.walk 扩大查找范围, 查找指定目录和子目录下的文件. 应用程序总览 读取 当 前目录及子目录下的所有 PY 和 txt ...

  3. Linux基本操作_20191117

    VMware和Ubuntu的安装, 想来想去,还是需要安装,不能老是使用Windows的,后面还有很多都要用到Linux系统的,这个可以说是开发人员必备的了, 基本的使用: 1,Windows下面C: ...

  4. spring boot web 开发及数据库操作

    推荐网站http://springboot.fun/ 1.json 接口开发 2.自定义 filter 3.自定义 property 4.log 配置 5.数据库操作 6.测试

  5. android完整智能家居、备忘录、蓝牙配对、3D动画库、购物车页面、版本更新自动安装等源码

    Android精选源码 app 版本更新.下载完毕自动自动安装 android指针式分数仪表盘 ANdroid蓝牙设备搜索.配对 Android 图片水印框架,支持隐形数字水印 android3D旋转 ...

  6. PHP调试工具PHP DEBUG TOOLS 使用方法

    一.安装篇安装前的准备环境:必须得先装X-Debug,至于怎样安装X-Debug请看http://www.xdebug.org/docs/install 1. 从http://www.xdebug.o ...

  7. 陈天奇XGBoost文章解读(未完成)

    这个是我下载的原文在看,然后结合一些网上的资料学习,先贴一个网上的资料. 终于有人说清楚了XGBoost算法 XGBoost阅读之Weighted quantile sketch XGBoost论文翻 ...

  8. 对Java8新的日期时间类的学习(一)

    引用自Java译站http://it.deepinmind.com/java/2015/03/17/20-examples-of-date-and-time-api-from-Java8.html 除 ...

  9. python-django框架-电商项目-商品模块开发_20191124

    用户浏览记录的添加 什么时候添加历史浏览记录? 在商品详情的视图里面添加浏览记录, 之前使用的list来存储浏览记录, 注意:如果good_id之前已经浏览过了,那就要移除,conn.lrem(his ...

  10. centos 7 下iptables参数详解

    在红帽RHEL7系统中firewalld服务取代了iptables服务,如果我们不想用或者不习惯使用firewalld服务,请看下面的操作: iptables命令中则常见的控制类型有: ACCEPT: ...