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

devtools/2024/9/24 7:10:01/

【代码】

#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.ppmy.cn/devtools/47154.html

相关文章

Windows10设置通过.net3.5访问HP DL585G7服务器iLO的控制台

HP DL585G7服务器设备较老了&#xff0c;本文记录如何通过.net3.5访问其iLO管理口的控制台&#xff0c;同类HP服务器可参考进行。 一、调试电脑版本 二、调试电脑安装.net3.5 请参考本人文档&#xff1a;Windows10 22H2用系统安装光盘安装.net3.5 三、Edge启用IE模式 请参考…

支持向量机(SVM): 从理论到实践的指南(1)

支持向量机&#xff08;SVM&#xff09;被誉为数据科学领域的重量级算法&#xff0c;是机器学习中不可或缺的工具之一。SVM以其优秀的泛化能力和对高维数据的管理而备受推崇。本文旨在梳理SVM的核心概念以及其在实际场景中的应用。 SVM的核心理念 SVM专注于为二分类问题找到最…

30岁迷茫?AI赛道,人生新起点

前言 30岁&#xff0c;对于许多人来说&#xff0c;是一个人生的分水岭。在这个年纪&#xff0c;有些人可能已经在某个领域取得了不小的成就&#xff0c;而有些人则可能开始对未来的职业方向感到迷茫。如果你正处于这个阶段&#xff0c;那么你可能会问自己&#xff1a;30岁转行…

算法题day41(补5.27日卡:动态规划01)

一、动态规划基础知识&#xff1a;在动态规划中每一个状态一定是由上一个状态推导出来的。 动态规划五部曲&#xff1a; 1.确定dp数组 以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 debug方式&#xff1a;打印 二、刷题&#xf…

CRM客户关系管理:全方位客户关系管理解决方案

CRM客户关系管理系统&#xff0c;基于Spring Cloud Alibaba、Spring Boot、MybatisPlus、Redis和VUE3 ElementUI微服务架构&#xff0c;提供全面的客户关系管理功能。系统智能化地管理客户信息、线索跟踪、商机开发、合同管理、回款计划等&#xff0c;助力企业提升客户满意度&a…

MyQueue(队列)

目录 一、队列的定义 二、队列方法的实现 1、定义队列 2、后端插入 3、前端操作 4、判断队列是否为空 5、队列大小 三、队列方法的使用 一、队列的定义 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&am…

使用 Spring Boot 开发邮件系统

文章目录 使用 Spring Boot 开发邮件系统邮件发送流程简单使用第 1 步&#xff1a;pom 包配置第 2 步&#xff1a;配置文件163 邮箱配置126 邮箱配置QQ 邮箱配置如下:开启 POP 3 / SMTP 服务、IMAP / SMTP 服务开通设置客户端授权密码 第 3 步&#xff1a;文本邮件发送第 4 步&…

2.4 OpenCV随手简记(五)

一、图像翻转 第一个图像翻转&#xff0c;这个可是制作表情包的利器。 图像翻转在 OpenCV 中调用函数 flip() 实现&#xff0c;原函数如下&#xff1a; flip(src, flipCode, dstNone) src&#xff1a;原始图像。 flipCode&#xff1a;翻转方向&#xff0c; 如果 flipCode 为…