迷宫求解问题--C++

news/2024/8/26 3:52:19 标签: c++, 数据结构, 开发语言

问题描述:有一张地图,0表示没有障碍物,1表示有障碍物,给你一幅地图、一个起始位置和一个目标位置,请判断是否能够从起始位置出发到达目标位置,可以的话将走过的路径用6进行标记

解题思路

将起始位置入栈;
拿到栈顶元素,判断栈顶元素是否已经访问过:
如果是让栈顶元素出栈,
如果不是在栈顶元素对应位置的上下左右四个方向进行查找是否有没有被访问过的并且可行的位置,如果有将其入栈;
重复上一步,直到栈为空或者栈顶元素就是目标位置;
如果栈顶元素就是目标位置,返回查找成功;
如果栈为空,说明没有可行的路径,查找失败;

#include<iostream>
#include<vector>
#include<stack>
using namespace std;

struct PosType
{
	int _x, _y;
	PosType() :_x(0), _y(0)
	{
	}
	PosType(int x, int y) :_x(x), _y(y)
	{
	}
};

bool operator==(const PosType& pos1, const PosType& pos2)
{
	return pos1._x == pos2._x && pos1._y == pos2._y;
}
bool operator!=(const PosType& pos1, const PosType& pos2)
{
	return pos1._x != pos2._x || pos1._y != pos2._y;
}

//迷宫输入
void InitMaze(vector<vector<int>>& map)
{
	cout << "迷宫地图初始化开始,0表示没有障碍物,1表示有障碍物" << endl;
	int row = map.size(), col = map[0].size();
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; ++j)
		{
			cin >> map[i][j];
		}
	}
	cout << "初始化完毕!" << endl;
}
//打印地图
void PrintMap(vector<vector<int>>& map)
{
	int row = map.size(), col = map[0].size();
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; ++j)
		{
			cout << map[i][j] << " ";
		}
		cout << endl;
	}
}
//判断是否有从beginPos到endPos的路径,使用栈
bool IsHasPath(vector<vector<int>>& map, PosType beginPos, PosType endPos)
{
	int rows = map.size(), cols = map[0].size();
	//判断位置是否有效
	if (beginPos._x < 0 || beginPos._x >= rows || beginPos._y < 0 || beginPos._y >= cols || endPos._x < 0 || endPos._x >= rows ||
		endPos._y < 0 || endPos._y >= cols || map[beginPos._x][beginPos._y] == 1 || map[endPos._x][endPos._y] == 1)
	{
		return false;
	}

	stack<PosType> st;
	vector<vector<bool>> visited(rows, vector<bool>(cols, false));//判断是否经过
	int nextStep[4][2] = { {0,1},{0,-1},{-1,0},{1,0} };
	st.push(beginPos);

	while (!st.empty() && st.top() != endPos)
	{
		PosType top = st.top();
		if (visited[top._x][top._y])
		{
			st.pop();
		}
		visited[top._x][top._y] = true;
		map[top._x][top._y] = 6;
		for (int i = 0; i < 4; ++i)
		{
			int curX = top._x + nextStep[i][0];
			int curY = top._y + nextStep[i][1];
			if (curX < 0 || curX >= rows || curY < 0 || curY >= cols)
			{
				continue;
			}
			if (map[curX][curY] == 0 && !visited[curX][curY])
			{
				st.push(PosType(curX, curY));
			}
		}
	}
	if (!st.empty() && st.top() == endPos)
	{
		map[st.top()._x][st.top()._y] = 6;
		return true;
	}
	else
	{
		return false;
	}
}
void GameStart(vector<vector<int>>& map)
{
	int row = map.size(), col = map[0].size();

	PosType beginPos, endPos;//起始位置,目标位置
	cout << "请输入起始位置下标:" << endl;
	cin >> beginPos._x >> beginPos._y;
	cout << "请输入目标位置下标:" << endl;
	cin >> endPos._x >> endPos._y;

	//判断是否可以到达目标位置
	bool ret = IsHasPath(map, beginPos, endPos);
	if (ret)
	{
		//可以到达目标位置,打印路径
		cout << "可以到达目标位置,路径如下,走过的位置用6表示" << endl;
		PrintMap(map);
	}
	else
	{
		cout << "无法到达" << endl;
	}
}


http://www.niftyadmin.cn/n/5558445.html

相关文章

Word参考文献交叉引用

前言 Word自带交叉引用功能&#xff0c;可在正文位置引用文档内自动编号的段落&#xff0c;同时创建超链接&#xff0c;适用于参考文献的引用。使用此方法对参考文献进行引用后&#xff0c;当参考文献的编号发生变化时&#xff0c;只需要更新域即可与正文中的引用相对应。下文…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【23】【订单服务】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【23】【订单服务】 订单中心订单信息用户信息订单基础信息商品信息优惠信息支付信息物流信息 订单状态订单流程订单创建与支付逆向流程 订单确认页Feign远程调用丢失请求头问题Feign异步…

解析CSS与JavaScript的使用方法及ECMAScript语法规则

一、CSS的三种使用方式 CSS&#xff08;层叠样式表&#xff09;用于定义网页的样式和布局。以下是CSS的三种使用方式&#xff1a; 1. 内联样式 内联样式是最直接的应用方式&#xff0c;它通过HTML标签的style属性来定义。 代码示例&#xff1a; <h1 style"color: …

HTTP缓存/强缓存/协商缓存

HTTP缓存是HTTP性能优化中一种简单高效的优化方式&#xff0c;通过保存资源副本并在下次请求时直接使用该副本&#xff0c;以减少对服务器的请求次数和数据传输量&#xff0c;从而提高网页加载速度和用户体验。以下是HTTP缓存的详细解释&#xff1a; 一、定义与工作原理 HTTP…

项目JetCache的常见配置与使用

Hello, 大家好&#xff0c;今天本汪给大家带来的是JetCache在项目中的常见配置与用法讲解&#xff0c;接下来&#xff0c;随本汪一起来看看吧 一、介绍 官网地址&#xff1a;https://github.com/alibaba/jetcache JetCache 是一种 Java 缓存抽象&#xff0c;它为不同的缓存…

GCC链接静态库和动态库详解

文章目录 1. 静态库和动态库 2. 静态库链接 3. 动态库链接 1. 静态库和动态库 链接&#xff08;linking&#xff09;是编译过程的最后一步&#xff0c;它将多个目标文件&#xff08; .o 文件&#xff09;和库文件结合在一起&#xff0c;生成一个可执行的二进制文件。链接的…

mac如何合并pdf文件到一个文件 macpdf合并 Mac如何合并pdf文件

在数字化的今天&#xff0c;pdf文件因其跨平台、格式统一等优势&#xff0c;已经成为工作、学习和生活中不可或缺的文件格式。然而&#xff0c;当我们需要合并多个pdf文件时&#xff0c;可能会感到有些无从下手。本文将为你详细介绍几种简单实用的合并pdf的方法&#xff0c;让你…

sklearn基础教程:从入门到精通

文章目录 sklearn基础教程&#xff1a;从入门到精通一、sklearn简介二、安装与配置三、数据预处理数据导入数据清洗特征选择数据标准化与归一化 四、常用模型介绍与应用线性回归逻辑回归决策树支持向量机K近邻算法随机森林集成学习 五、模型评估与调优交叉验证网格搜索模型评估…