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

问题描述: 非常简洁明了的问题, 即对于一个由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. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-关于parfor的问题

    1 我们知道MATLAB支持并行运行一般有四种模式: 第一种模式:本机调用多核CPU性能并行运算 第二种模式:本机调用GPU性能并行运算 第三种模式:多计算机组成集群,调用集群CPU性能并行运算 第四 ...

  2. TOJ-2811 Bessie's Weight Problem(DP、背包问题)

    链接:https://ac.nowcoder.com/acm/contest/1082/K 题目描述 Bessie, like so many of her sisters, has put on a ...

  3. ionic3 修改页面切换动画

    在app.module.ts中 配置pageTransition属性 [ BrowserModule, IonicModule.forRoot(MyApp, { pageTransition: 'io ...

  4. 【更新中】Hotspot tracer

    Hotspot Follower 闲着没事,打算做一个爬取社会热点的项目,首先通过微信搜狗进行分析. 代码基于PYTHON import requests import json def page(s ...

  5. mysql关键字汇总

    ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL CASCADE C ...

  6. mysql 子查询不支持limit

    mysql执行如下语句 : SELECT * FROM `xxx_base_info` where yn =1 and xxx_keeper_id in (SELECT id FROM `user`w ...

  7. 奇点云 x 阿里云 | 联合发布综合体数字化转型与数据创新解决方案

    2019年7月25日下午,在阿里云峰会上海站,奇点云入选阿里云首批联合解决方案合作伙伴,并联合发布了“综合体数字化转型与数据创新解决方案”,共同探索综合体的智能服务. 关于综合体的数字化转型,奇点云联 ...

  8. 推荐几个树莓派 raspbian 系统 可用的 arm docker源

    树莓派刚到手各种尝鲜,试过不少系统,最后还是回归了raspbian os 系统 root@raspberrypi:/home/pi# cat /proc/version Linux version 4 ...

  9. HUPO|PSI|PeptideAtlas|TPP|Partial submission|Complete submission|proteomeXchange

    蛋白质组实验数据提交 需要共享数据,共享要求: 质谱实验数据 HUPO Proteomics Standards Initiative (http://www.psidev.info/overview ...

  10. 浙江省第十六届大学生ACM程序设计竞赛部分题解

    E .Sequence in the Pocket sol:将数组copy一份,然后sort一下,找寻后面最多多少个元素在原数组中保持有序,用总个数减去已经有序的就是我们需要移动的次数. 思维题 #i ...