题号1577 E.迷宫plus (有趣的BFS练习)

news2025/7/14 1:38:31

题目:样例:

输入
1
5 5
LRLRL
LLLLL
RRRRR
UUUUU
UUUUD
输出
4

思路:

        一般遇到坐标迷宫,基本上都是DFS 或者 BFS ,这里多了一个条件就是要最少修改操作数,所以我们DFS很难控制这一条件,通过 BFS 搜索,利用BFS常用的队列改成优先队列形式搜索即可,优先最少修改的操作数坐标我们往该坐标上走动即可。

代码详解如下:

#include <iostream>
#include <queue>
#include <cstring>
#define endl '\n'
#define x first
#define y second
#define int long long
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 1000;

using PII = pair<int,int>;	// 定义变量名坐标对组

int n,m;
string g[N];	// 迷宫图

PII r[N];	// 存储对应字符的移动操作坐标变化

string Move = "LRUD";// 移动操作

bool st[N][N];	// 标记是否走动过当前坐标,对应题目中的“到达后门又关上“

// 坐标结构体
struct Coord
{
	int x,y;	// 坐标
	int cnt;	// 计数修改次数
	
	// 构造结构体函数
	inline Coord(int _x,int _y,int _cnt):x(_x),y(_y),cnt(_cnt){}
	
	// 重载比较符,定义排序规则,优先修改次数少的坐标
	// 我们向那个坐标走
	inline bool operator<(const Coord&t)const
	{
		return cnt > t.cnt;
	}
};

// 判断是否可以走动的条件
inline bool isRun(Coord& next)
{
	int x = next.x,y = next.y;
	return (x >= 0 && x < n && y >= 0 && y < m && !st[x][y]);
}

// 重载 + 运算符,方便我们结构体坐标累加变化
inline Coord operator+(Coord&a,PII&b)
{
	return Coord(a.x + b.x,a.y + b.y,a.cnt);
}

inline int BFS()
{
	// 优先队列,存储走动的坐标计划
	priority_queue<Coord>q;
	
	// 存储起点,和操作次数的状态
	q.emplace(Coord(0,0,0));
	
	// 开始 BFS 搜索
	while(q.size())
	{
		// 获取当前走动到的坐标
		Coord now = q.top();
		q.pop();
		
		st[now.x][now.y] = true;	// 关上后面,即标记坐标
		
		// 如果到达了迷宫出口,输出最少操作数
		if(now.x == n - 1 && now.y == m - 1)
		{
			return now.cnt;
		}
		
		// 对每一个移动操作搜索是否可行
		for(int i = 0;i < 4;++i)
		{
			char op = Move[i];	// 获取操作的字符
			
			Coord next = now + r[op];	// 更新操作后的当前坐标
			
			// 判断是否符合走动条件
			if(isRun(next))
			{
				// 如果可以走动,该操作等于当前迷宫格子的操作符
				// 那么不用计数修改操作数,反之 修改操作数 + 1
				if(g[now.x][now.y] == op) q.emplace(Coord(next.x,next.y,next.cnt));
				else q.emplace(Coord(next.x,next.y,next.cnt + 1));
			}
		}
	}
	// 给个返回值,如果走不出出口返回-1
	return -1;	
}

inline void solve()
{
	
	// 清空上一个样例所标记的
	memset(st,false,sizeof st);
	
	// 输入各种信息
	cin >> n >> m;
	for(int i = 0;i < n;++i)
	{
		cin >> g[i];
	}
	
	//输出答案
	cout << BFS() << endl;
	
}

signed main()
{
//	freopen("a.txt", "r", stdin);
	
	// 标记对应的操作方向,坐标变化
	r['L'] = PII(0,-1);
	r['R'] = PII(0,1);
	r['U'] = PII(-1,0);
	r['D'] = PII(1,0);
	
	IOS;
	int _t = 1;
	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157954.html

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

相关文章

堆排序之“TOP-K”问题

目录 一、什么是TOP-K问题 二、解决思路 一般的正常思路&#xff1a; 最优的解决思路&#xff1a; 三、文件流中实践TOP-K方法 创建包含足够多整数的文件&#xff1a; 找出最大的K个数 完整版代码&#xff1a; 前面我已经学习过使用“堆排序”对数组排降序了&#xf…

Goby 漏洞发布|F5 BIG-IP AJP 身份认证绕过漏洞(CVE-2023-46747)

漏洞名称&#xff1a;F5 BIG-IP AJP 身份认证绕过漏洞&#xff08;CVE-2023-46747&#xff09; English Name&#xff1a;F5 BIG-IP AJP authentication bypass vulnerability (CVE-2023-46747) CVSS core: 10 影响资产数&#xff1a; 307282 漏洞描述&#xff1a; Cisco …

idea导入git代码

第一种 在本地建一个文件夹&#xff0c;右击 git init git clone https://xxx/xxx.git 发现账号是自己的账号如何改成公司的账号呢&#xff1f;我用的方式是 控制面板 删除后&#xff0c;就可以再次导入代码&#xff0c;就可以输入公司的账号和密码。 第二种 在idea上导入…

比较BFS和DFS

目录 代码框架对比 引出模板 代码框架对比 dfs是栈的递归&#xff0c;bfs是队列的入出。 引出模板 x可以是栈可以是队列&#xff0c;也可以是随机队列、随机容器&#xff0c;一样可以把整张图遍历出来。

Go的命令行工具开发:使用Cobra库

今天我们将深入探讨如何使用Go语言和Cobra库来开发命令行工具。 命令行工具在软件开发中有着广泛的应用&#xff0c;它们快速、高效&#xff0c;且易于自动化。 Go语言因其简洁、高效而被广泛用于命令行工具的开发。Cobra库则是Go中用于构建命令行工具的重要库之一。 为什么选…

Android错题

ctrlo键没有onCrate() 只有继承这个Fragment框架 才能调用ctrlo键onCrate()

比赛准备笔记 --- TensotFlow、软件调试、数据预处理(图像,csv数据)

简介 TensorFlow是由Google团队开发的一个开源深度学习框架&#xff0c;完全基于Python语言设计。它的初衷是以最简单的方式实现机器学习和深度学习的概念&#xff0c;结合了计算代数的优化技术&#xff0c;使计算许多数学表达式变得简单。 优势&#xff1a; 强大的计算能力…

学习笔记二十六:storageclass存储类动态生成存储

storageclass存储类动态生成存储 storageclass作用StorageClass 定义provisioner&#xff1a;供应商reclaimPolicy&#xff1a;回收策略 安装nfs provisioner&#xff0c;用于配合存储类动态生成pv前置条件扩展&#xff1a;什么是sa安装nfs-provisioner程序创建storageclass&am…

DeepSDA

作者未提供代码

会议剪影 | 思腾合力携AI服务器亮相CNCC 2023中国计算机大会

10月26日-28日&#xff0c;第二十届中国计算机大会(CNCC 2023)在沈阳的沈阳新世界博览馆举办。本次大会注册参会观众达到1.3万名&#xff0c;同时还有超过3.6万人次通过CCF视频号直播观看开幕式、特邀报告和大会论坛。直播的4场论坛和活动&#xff0c;人气值达到73万。 “CNCC是…

AR眼镜定制开发-智能眼镜的主板硬件、软件

AR眼镜定制开发是一项复杂而又重要的工作&#xff0c;它需要准备相关的硬件设备和软件。这些设备包括多个传感器、显示装置和处理器等。传感器用于捕捉用户的动作和环境信息&#xff0c;如摄像头、陀螺仪、加速度计等;显示装置则用于将虚拟信息呈现给用户;处理器用于处理和协调…

关于服务端构件模型的典型解决方案

关于服务端构件模型的典型解决方案包括 适用于应用服务器的EJB模型&#xff08;Sun公司J2EE的一部分&#xff09;和COM模型&#xff08;微软公司&#xff09;&#xff0c; 以及适用于Web服务器的servlet模型&#xff08;基于Sun公司JSP技术&#xff09;和Visual Basic及其他技…

NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063

nifi好用,但是对机器的性能要求也高,如果性能达不到,就会导致,问题发生,比如,队列里显示有内容,但是实际上队列是空的,清也清不掉,只能重启,很麻烦. 关于优化:1.配置前端页面刷新的间隔时间默认30秒,我们可以自己需要看的时候手动刷新我们改成300sec 2.修改CPU阻塞时间,提高CPU…

CSS3网页布局基础

CSS布局始于第2个版本&#xff0c;CSS 2.1把布局分为3种模型&#xff1a;常规流、浮动、绝对定位。CSS 3推出更多布局方案&#xff1a;多列布局、弹性盒、模板层、网格定位、网格层、浮动盒等。本章重点介绍CSS 2.1标准的3种布局模型&#xff0c;它们获得所有浏览器的全面、一致…

【Unity】Addressables资源管理笔记

【Unity】Addressables资源管理笔记 Addressables是一种用于管理资源的系统。允许以一种灵活的方式加载、卸载和管理资源&#xff0c;无论是场景、预制件、材质、纹理、音频剪辑等。 一、快速实现 安装Addressables插件 把对象添加到组 1&#xff09;打开AddressablesGroups面…

本地创建一个虚拟机,并且能够连接到外网

1、从官网下载虚拟机 2、详细的安装教程 点击这里 其中这里的获取&#xff0c;我们店自动IP地址获取就行了&#xff0c;DNS也是自动获取就行了。 4、注意事项 4.1 linux命令:vim: command not found无法使用解决方案, 点击这里

tensorflow-gpu轮子安装

文章目录 简介一、虚拟环境二、安装 TensorFlow-GPU&#xff08;最新&#xff09;版本三、安装 TensorFlow-GPU&#xff08;指定&#xff09;版本四、打印信息4.1、检查当前TensorFlow版本号4.2、检查当前TensorFlow是否支持GPU4.3、检查当前PyTorch是否支持GPU4.4、选择Tensor…

漏洞复现--金蝶云星空 CommonFileServer 任意文件读取

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

redis 网课笔记

缓存 缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库。 解决方案 给不同的key的TTL添加随机值利于Redis集群提高服务的可用性 哨兵模式、集群模式给缓存业务添加降级限流策略 ngxin或spring cloud gateway给业务…

Python中如何使用pandas和matplotlib库绘制图表

目录 一、引言 二、pandas基础 三、matplotlib基础 四、pandas与matplotlib的结合 五、高级图表与深度分析 结论 本文详细探讨了Python中两个重要的库——pandas和matplotlib&#xff0c;它们在数据处理和可视化中的应用。通过实例代码&#xff0c;我们深入了解了如何利用…