当前位置: 首页 > news >正文

迷宫最短路径求解--c++

【代码】

#include<iostream>
#include<queue>
#include<stack>
using namespace std;
#define ROW 8
#define COL 8
//测试迷宫数据
int maze[ROW][COL] = {{0,0,0,1,0,0,0,0},{0,1,0,1,0,1,0,1},{0,1,0,0,0,1,0,1},{0,1,0,1,1,1,0,1},{0,1,0,1,1,0,0,0},{0,1,1,0,0,0,1,1},{0,0,0,0,1,0,1,1},{1,1,1,0,0,0,0,0}
};typedef struct
{int index;  //当前点在路径结点数组中的位置int parent_idx; //当前经过点的上一个点在路径结点数组中的位置int x, y;   //当前点的坐标
}PathNode;
//迷宫中每个点第一次出现时放入数组,为后续查找路径提供信息
PathNode path[ROW * COL];
//已访问数组,表示每个点是否已被访问
bool vis[ROW][COL] = { false };
//方向结构体
typedef struct
{int xstep, ystep;
}Dir;
Dir dir[4] = { {-1,0},{0,-1},{1,0},{0,1} };
bool validate(int x, int y)
{return x >= 0 && x < ROW && y >= 0 && y < COL;
}
//根据出口结点反向查找路径
void identifyPath(PathNode node)
{stack<PathNode>s;int skips = 0;//从最后一个节点逐次入栈,反向找到最短路径上的每个点while (true){s.push(node);if (node.parent_idx == -1)break;node = path[node.parent_idx];}cout << "path:" << endl;while (!s.empty()){node = s.top();s.pop();cout << "(" << node.x << "," << node.y << ")";if (!s.empty()){skips++;cout << "->";}}cout << endl;cout << "path length:" << skips << endl;
}//寻找以(sx,xy)为起点,(ex,ey)为出口的迷宫路径
//使用图的广度优先遍历,从起点开始逐层往外扩散,直到出现出口坐标
void findShortestPath(int sx, int sy, int ex, int ey)
{PathNode pn;int idx = 0;int cnt = 0;//初始化,生成开始结点信息,并放入路径数组中pn.parent_idx = -1;pn.x = sx;pn.y = sy;pn.index = 0;vis[pn.x][pn.y] = true;path[cnt++] = pn;while (1){//找出队列中未访问的第一个元素PathNode node = path[idx++];//搜索四个方向,形成下一步可以通过的坐标for (int j = 0; j < 4; j++){int newx = node.x + dir[j].xstep;int newy = node.y + dir[j].ystep;//如果下一步坐标合法,未被访问且可以通过if (validate(newx, newy) && !vis[newx][newy] && maze[newx][newy] == 0){//生成新的结点PathNode pn;pn.x = newx;pn.y = newy;pn.parent_idx = node.index;pn.index = cnt;//如果为新的结点为出口,确定路径并返回if (newx == ex && newy == ey){identifyPath(pn);return;}//将新的结点放入路径数组中path[cnt++] = pn;//设置该结点已被访问过vis[newx][newy] = true;}}//如果遍历完所有的结点都没有找到出口,说明没有路径if (idx == cnt){cout << "no solution" << endl;break;}}
}int main()
{findShortestPath(0, 0, ROW - 1, COL - 1);return 0;
}

http://www.lryc.cn/news/369959.html

相关文章:

  • SpringFramework总结
  • 品牌与产品:消费者决策的经济逻辑与品牌宣传的战略意义
  • MFC四种方法编写多线程
  • VPN简介
  • 【C/C++】用C语言写一个数据仓库,存储和修改数据
  • YOLO v5与YOLO v8框图比较
  • Redis集群(5)
  • STM32H5 DAC 配置
  • 第十九节:暴力递归到动态规划
  • 服务器部署spring项目jar包使用bat文件,省略每次输入java -jar了
  • 2024备忘知识点
  • JS基础与高级应用: 性能优化
  • Python | Leetcode Python题解之第145题二叉树的后序遍历
  • 公司面试题总结(二)
  • 人脸识别和 ArcFace:用于深度人脸识别的附加角边际损失
  • 双标引领:汽车软件安全的ASPICE与ISO21434之道
  • 再度牵手,制造升级 | 毅达科技IMS OS+通用产品集+行业套件项目正式启动!
  • 大疆智图_空三二维重建成果传输
  • python实现无人机航拍图片像素坐标转世界坐标
  • C#面:什么是 Windows 服务,它的生命周期与标准的 EXE 程序有什么不同
  • Java基础面试题自测
  • 【LeetCode 第 401 场周赛】K秒后第 N 个元素的值
  • 游戏心理学Day10
  • MySQL表设计经验汇总篇
  • Servlet基础(续集2)
  • 【云原生】创建harbor私有仓库及使用aliyun个人仓库
  • 什么是SOLIDWORKS科研版
  • 微信小程序页面配置
  • 如何将JPG/PNG位图免费快速一键转换成SVG格式的矢量图
  • YOLO检测环境安装配置