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

news2024/11/16 17:43:19

【代码】

#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.coloradmin.cn/o/1812620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一百零四节 Java面向对象设计 - Java内部类成员

Java面向对象设计 - Java内部类成员 内部类可以访问其所有实例成员&#xff0c;实例字段和其封闭类的实例方法。 class Outer {private int value 2014;public class Inner {public void printValue() {System.out.println("Inner: Value " value);}} // Inner …

这三款思维导图工具,真的很好用

XMIND XMIND是优秀的国产思维导图和头脑风暴软件&#xff0c;非常符合国人的使用要求&#xff0c;旨在帮助用户理清思路、捕捉创意&#xff0c;并提高工作和生活效率。支持Linux、IOS、Android、MAC平台。 提供了非常多精美的结构图&#xff0c;例如鱼骨图、逻辑图、括号图、树…

Django DeleteView视图

Django 的 DeleteView 是一个基于类的视图&#xff0c;用于处理对象的删除操作。 1&#xff0c;添加视图函数 Test/app3/views.py from django.shortcuts import render# Create your views here. from .models import Bookfrom django.views.generic import ListView class B…

点云分割报告整理(未完成版-每天写一点)

体积占用网格表示对点进行体素化&#xff0c;然后使用3d卷积神经网络来学习体素级语义。由于点云的稀疏性&#xff0c;体素化效率低&#xff0c;为避免较高的计算成本而忽略了细节。此外&#xff0c;由于同一体素内的所有点都被赋予了相同的语义标签&#xff0c;因此精度受到限…

详解MySQL中的PERCENT_RANK函数

目录 1. 引入1. 基本使用2&#xff1a;分组使用3&#xff1a;处理重复值4. 使用优势4.1 手动计算百分等级4.2 使用 PERCENT_RANK 的优势4.3 使用 PERCENT_RANK 5. 总结 在 MySQL 中&#xff0c;PERCENT_RANK 函数用于计算一个值在其分组中的百分等级。 它的返回值范围是从 0 …

广州商学院数字经济产业学院领导莅临泰迪智能科技参观交流

6月6日&#xff0c;广州商学院数字经济产业学院主任潘鹏、专业负责人欧阳峰、专业老师刘宇宏莅临广东泰迪智能科技股份有限公司产教融合实训基地参观交流。泰迪智能科技董事长张良均、中职事业部总经理李振林、校企合作经理吴桂锋进行热情接待&#xff0c;双方就专业建设、人才…

超详解——深入详解Python基础语法——基础篇

目录 1 .语句和变量 变量赋值示例&#xff1a; 打印变量的值&#xff1a; 2. 语句折行 反斜杠折行示例&#xff1a; 使用括号自动折行&#xff1a; 3. 缩进规范 缩进示例&#xff1a; 4. 多重赋值&#xff08;链式赋值&#xff09; 多重赋值的应用&#xff1a; 5 .多…

20个国家科学数据中心(中)

7、国家极地科学数据中心平台 网址&#xff1a;http://www.chinare.org.cn 简介&#xff1a;国家极地科学数据中心&#xff08;www.chinare.org.cn&#xff0c;以下称"本网站或NADC网站&#xff09;的前身是中华人民共和国科技部1999年资助下建立的中国极地科学数据库系…

项目部署(前后端)

一&#xff1a;多环境概念&#xff1a; 借鉴来源&#xff1a;多环境设计_程序员鱼皮-多环境设计-CSDN博客 为什么需要多环境&#xff1a; 第一个例子&#xff1a;我们可以设想&#xff0c;我们肯定玩过王者荣耀&#xff0c;且王者荣耀也一直在不断更新&#xff0c;如果按我们…

STM32F103C8T6移植U8g2图形库及基于I2C协议的OLED显示(HAL库方式)【U8g2】【STM32开发板】【STM32CubeMX】

STM32F103C8T6移植U8g2图形库及基于I2C协议的OLED显示&#xff08;HAL库方式&#xff09;【U8g2】【STM32开发板】【STM32CubeMX】 实验说明 利用STM32F103的GPIO管脚、VCC和GND连接OLED屏的I2C接口&#xff0c;采用CubeMX设计一个HAL库程序框架&#xff0c;然后下载U8g2源码…

算法:94. 二叉树的中序遍历--扩展前中后层序遍历

中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 中遍历结果为&#xff1a;H D I B E J A F K C G 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#x…

图片二维码在线制作的教程,轻松实现图片转二维码

现在很多的内容都会放入二维码中来提供展示&#xff0c;这种方法可以有效的将大量的内容通过扫码这种简单的方式来获取。比如将图片转二维码后&#xff0c;就可以用手机扫码查看图片&#xff0c;无需通过软件传输后下载才可以查看&#xff0c;并且这种方式还可以提升图片的安全…

后端开发面经系列 -- 华为OD -- C++面经(全)

华为OD – C面经&#xff08;全&#xff09; 公众号&#xff1a;阿Q技术站 文章目录 华为OD -- C面经&#xff08;全&#xff09;一面1、C结构体和类的区别&#xff0c;类默认的访问权限&#xff0c;结构体可以定义成员函数吗&#xff1f;2、多态的意义&#xff1f;多态的意义…

数据结构刷题-链表

数据结构刷题-链表 总结&#xff1a;1 链表的解法总结&#xff1a; 1 链表的知识点&#xff1a;1 LC链表合集&#xff1a;1.1 lc206反转链表&#xff1a; 双指针&#xff1a;lc25: K个一组翻转链表&#xff1a;栈1.2 lc203移除链表元素&#xff1a;1.3 设计链表&#xff1a;1.4…

基于C#开发web网页管理系统模板流程-总集篇

第一篇 基于C#开发web网页管理系统模板流程-登录界面和主界面_c#的网页编程-CSDN博客 第二篇 基于C#开发web网页管理系统模板流程-主界面管理员录入和编辑功能完善_c#网页设计-CSDN博客 第三篇 基于C#开发web网页管理系统模板流程-主界面管理员入库和出库功能完善_c#web程序设计…

【Vue】项目创建目录初始化

文章目录 vue-cli 建项目调整初始化目录结构 vue-cli 建项目 1.安装脚手架 (已安装) npm i vue/cli -g2.创建项目 vue create hm-shopping选项 Vue CLI v5.0.8 ? Please pick a preset:Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint) > Manually sel…

[CAN] DBC数据库编辑器的下载与安装

DBC数据库编辑器 1 概述2 下载与安装2.1 下载2.2 安装 1 概述 VectorCANdb是一款专为CAN&#xff08;Controller Area Network&#xff09;通信设计的数据管理工具。这款软件为工程师们提供了一个全面、高效的平台&#xff0c;用于定义、修改和管理与CAN网络相关的数据&#xf…

【CS.PL】Lua 编程之道: 简介与环境设置 - 进度8%

1 初级阶段 —— 简介与环境设置 文章目录 1 初级阶段 —— 简介与环境设置1.1 什么是 Lua&#xff1f;特点?1.2 Lua 的应用领域1.3 安装 Lua 解释器1.3.1 安装1.3.2 Lua解释器的结构 1.4 Lua执行方式1.4.0 程序段1.4.1 使用 Lua REPL&#xff08;Read-Eval-Print Loop&#x…

卫星通讯传输电力运维巡检EasyCVR视频汇聚平台智能监控方案

随着科技的快速发展&#xff0c;视频监控技术已广泛应用于各个领域。而卫星通讯作为一种高效、稳定的通信方式&#xff0c;为视频监控系统的远程传输提供了有力支持。 一、方案背景 随着电力行业的快速发展&#xff0c;电力运维巡检工作变得愈发重要。传统的巡检方式往往受到…

二分查找算法:穿越算法迷宫的指南

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 目录 前言 一. 二分查找算法介绍 二 二分查找的题目解析 2.1 二分查找 2.2 在排序数组中查找元素的第一个位置和最后一个位置 2.3 搜索插入位置 2.4 x的平方根 2.5 山峰数组峰顶的索引 2.6 寻找峰值 2.7 寻找旋转数…