1131. 拯救大兵瑞恩(dp思想运用,set)

1131. 拯救大兵瑞恩 - AcWing题库

1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩。

瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图。

迷宫的外形是一个长方形,其南北方向被划分为 N 行,东西方向被划分为 M 列, 于是整个迷宫被划分为 N×M 个单元。

每一个单元的位置可用一个有序数对 (单元的行号, 单元的列号) 来表示。

南北或东西方向相邻的 22 个单元之间可能互通,也可能有一扇锁着的门,或者是一堵不可逾越的墙。

注意: 门可以从两个方向穿过,即可以看成一条无向边。

迷宫中有一些单元存放着钥匙,同一个单元可能存放 多把钥匙,并且所有的门被分成 P 类,打开同一类的门的钥匙相同,不同类门的钥匙不同。

大兵瑞恩被关押在迷宫的东南角,即 (N,M) 单元里,并已经昏迷。

迷宫只有一个入口,在西北角。

也就是说,麦克可以直接进入 (1,1) 单元。

另外,麦克从一个单元移动到另一个相邻单元的时间为 1,拿取所在单元的钥匙的时间以及用钥匙开门的时间可忽略不计。

试设计一个算法,帮助麦克以最快的方式到达瑞恩所在单元,营救大兵瑞恩。

输入格式

第一行有三个整数,分别表示 N,M,P 的值。

第二行是一个整数 k,表示迷宫中门和墙的总数。

接下来 k 行,每行包含五个整数,Xi1,Yi1,Xi2,Yi2,Gi:当 Gi≥1 时,表示 (Xi1,Yi1) 单元与 (Xi2,Yi2) 单元之间有一扇第 Gi 类的门,当 Gi=0 时,表示 (Xi1,Yi1) 单元与 (Xi2,Yi2) 单元之间有一面不可逾越的墙。

接下来一行,包含一个整数 S,表示迷宫中存放的钥匙的总数。

接下来 S 行,每行包含三个整数 Xi1,Yi1,Qi,表示 (Xi1,Yi1) 单元里存在一个能开启第 Qi 类门的钥匙。

输出格式

输出麦克营救到大兵瑞恩的最短时间。

如果问题无解,则输出 -1。

数据范围

|Xi1−Xi2|+|Yi1−Yi2|=1
0≤Gi≤P
1≤Qi≤P
1≤N,M,P≤10
1≤k≤150

输入样例:
4 4 9
9
1 2 1 3 2
1 2 2 2 0
2 1 2 2 0
2 1 3 1 0 
2 3 3 3 0
2 4 3 4 1
3 2 3 3 0
3 3 4 3 0
4 3 4 4 0
2
2 1 2 
4 2 1
输出样例:
14
样例解释:

迷宫如下所示:

1131.png

解析: 

如果没有门的存在,那么可以使用bfs处理。如果加上门之后我们还用d[i]表示i点的最短距离的话是无法表示所有状态的(无法判断当前是否有钥匙),因此直观的想法是增加一些状态。

其实最短路的拆点过程类似与dp的状态压缩在所有最短路中需要拆点或分层的问题中,都可以使用dp的分析方式。

因此我们可以进行状态划分:不重不漏,将状态转移所依据的状态体现出来;

d[x,y,state]表示:所有从起点走到(x,y)这个格子,且当前已经拥有的钥匙是state(类似状态压缩中的二进制表示)的所有路线的集合。值表示此状态下到达该点的最小值。

状态转移:

1.(x,y)这里有一些钥匙,那么可以直接将所有钥匙拿起,state | key :

d[x,y,state | key]=min(d[x,y,state | key],d[x,y,state]);

2.向上下左右四个方向走。(1)没有门和墙;(2)有门,且有匹配的钥匙(a,b):

d[a,b,state]=min(d[a,b,state],d[a,b,state]+1)

这里虽然使用dp的方式分析,但这道题是无法直接使用dp的方式处理的,因为:dp方式处理需要确保状态之间有拓扑序,本题中的状态转移过程可能存在环形,也就是后效性。

dp相当于求拓扑图上的最短路。因此我们可以直接使用最短路问题处理dp问题。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
using namespace std;
typedef pair<int, int> PII;
const int N = 100 + 5, M = (N + 1) * N * 2,P=1<<10;
int n, m, p, k;
int h[N], e[M], w[M], ne[M], idx;
int g[N][N], d[N*N][P],key[P];
int vis[N][P];
set<PII>st;

void add(int a, int b, int c) {
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

void build() {
	int dx[] = { -1,0,1,0 }, dy[] = { 0,1,0,-1 };
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			for (int u = 0; u < 4; u++) {
				int a = i + dx[u], b = j + dy[u];
				if (a > n || a <= 0 || b>m || b<=0)continue;
				if (!st.count({ g[i][j],g[a][b] }))
					add(g[i][j], g[a][b], 0);
			}
		}
	}
}

int bfs() {
	memset(d, 0x3f, sizeof d);
	d[1][0] = 0;
	deque<PII>q;
	q.push_back({ 1,0 });
	while (!q.empty()) {
		PII t = q.front();
		q.pop_front();
		if (vis[t.first][t.second])continue;
		vis[t.first][t.second] = 1;
		if (t.first == n * m)return d[t.first][t.second];
		if (key[t.first]) {
			int state = t.second|key[t.first];
			if (d[t.first][state] > d[t.first][t.second]) {
				d[t.first][state] = d[t.first][t.second];
				q.push_back({ t.first,state });
			}
		}
		for (int i = h[t.first]; i != -1; i = ne[i]) {
			int j = e[i];
			if (w[i] && !(t.second >> w[i] - 1 & 1))continue;
			if (d[j][t.second] > d[t.first][t.second] + 1) {
				d[j][t.second] = d[t.first][t.second] + 1;
				q.push_back({ j,t.second });
			}
		}
	}
	return -1;
}

int main() {
	cin >> n >> m >> p >> k;
	for (int i = 1,t=1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			g[i][j] = t++;
		}
	}
	memset(h, -1, sizeof h);
	for (int i = 1,a,b,a1,b1,c; i <= k; i++) {
		scanf("%d%d%d%d%d", &a, &b, &a1, &b1, &c);
		st.insert({ g[a1][b1],g[a][b] });
		st.insert({ g[a][b],g[a1][b1] });
		if (c)add(g[a][b], g[a1][b1], c), add(g[a1][b1], g[a][b], c);
	}
	build();
	int s;
	cin >> s;
	while (s--) {
		int x, y, c;
		cin >> x >> y >> c;
		key[g[x][y]] |= 1 << c - 1;
	}

	cout << bfs() << endl;
	return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文心一言 vs. ChatGPT:哪个更胜一筹?

文心一言 vs. ChatGPT&#xff1a;从简洁美到深度思考的文本生成之旅 近年来&#xff0c;文本生成工具的崛起使得人们在表达和沟通方面拥有了更多的选择。在这个领域中&#xff0c;文心一言和ChatGPT作为两个备受瞩目的工具&#xff0c;各自以独特的优势展现在用户面前。本文将…

Maven普通工程和web工程创建

文章目录 创建项目前设置maven工程前设置工作创建项目前--》设置utf-8配置maven参数Maven普通工程和web工程创建Maven简单工程第一步&#xff1a;File–New–Project 第二步&#xff1a;选择maven然后下一步&#xff1a;填写后询选择finish初始化maven工程目录简介maven简单工程…

单列的堆叠柱状图

目的 MSingleColumnStackBarChart类被设计用于创建只有单列的堆叠柱状图&#xff0c;用于血糖数据的统计。以下是封装这个类的目的的详细描述&#xff1a; 抽象复杂性&#xff1a; 通过创建MSingleColumnStackBarChart类&#xff0c;你将复杂的MPAndroidChart库的使用和配置封…

合并两个有序数组(简单)

一、题目 给你两个按 非递减顺序 排列的整数数组nums1和nums2&#xff0c;另有两个整数m和n&#xff0c;分别表示nums1和nums2中的元素数目。请你 合并 nums2到nums1中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a; 最终&#xff0c;合并后数组不应由…

PyTorch——torchtext与PyTorch匹配的版本

一、匹配版本的对照表 二、按照对应版本的命令 例子&#xff1a; pip install torchtext0.9.1参考资料&#xff1a; Torchtext and PyTorch s Version Compatibility

第七在线荣获百灵奖 Buylink Awards 2023零售圈年度卓越服务商品牌

1月11日&#xff0c;由零售圈主办、20零售连锁协会协办、30零售行业媒体支持的中国零售圈大会暨2024未来零售跨年盛典在西安落下帷幕&#xff0c;在这个零售行业盛典中&#xff0c;第七在线凭借其高精尖产品和卓越的服务质量成功入选&#xff0c;并荣获了“百灵奖 Buylink Awar…

基于 IDEA 创建 Maven 的 Java SE 工程和 Java Web 工程

一、概念简介 Maven 工程相对之前的项目&#xff0c;多出一组 gavp 属性&#xff0c;gav 需要我们在创建项目的时候指定&#xff0c;p 有默认值&#xff0c;我们先行了解下这组属性的含义。 Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写&am…

c语言嵌套循环

c语言嵌套循环 c语言嵌套循环 c语言嵌套循环一、c语言嵌套循环类型二、嵌套循环案例九九惩罚口诀 一、c语言嵌套循环类型 for(初始值&#xff1b;表达式&#xff1b;表达式) {for&#xff08;初始值&#xff1b;表达式&#xff1b;表达式&#xff09;{代码} }int main() {for (…

Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)

说明&#xff1a;都知道&#xff0c;我是搞java的&#xff0c;最近搞c的算法和redis数据库比较多&#xff0c;所以对于以下文章&#xff0c;都是我自己这样认为的&#xff0c;各位看完之后&#xff0c;可尽情评论。 GraalVM Native Image Support 具体用法 以往文章&#xff…

基于SSM的项目监管系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

C#用Math.Round和double.TryParse方法实现四舍五入

目录 一、涉及到的知识点 1.double.TryParse&#xff08;&#xff09;方法 2.Math.Round(Decimal, Int32) 方法 3.comboBox1没有选项 二、示例 1.源码 2.生成 一、涉及到的知识点 1.double.TryParse&#xff08;&#xff09;方法 详见本文作者写的其他文章&#xff0…

C++(1) —— 基础语法入门

目录 一、C初识 1.1 第一个C程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 二、数据类型 2.1 整型 2.2 sizeof 关键字 2.3 实型&#xff08;浮点型&#xff09; 2.4 字符型 2.5 转义字符 2.6 字符串型 2.7 布尔类型 bool 2.8 数据的输入 三…

【EI会议征稿通知】第四届图像处理与智能控制国际学术会议(IPIC 2024)

第四届图像处理与智能控制国际学术会议&#xff08;IPIC 2024&#xff09; 2024 4th International Conference on Image Processing and Intelligent Control 2024年第四届图像处理与智能控制国际学术会议&#xff08;IPIC 2024&#xff09;将于2024年5月3日-5日在吉隆坡举…

Web server failed to start. Port 8080 was already in use. 端口被占用

Web server failed to start. Port 8080 was already in use. 端口被占用。 1、cmd回车打开命令窗口 查看端口号是否被占用 netstat -ano|findstr “8080” 2、查看进程号对应的进程名称 tasklist|findstr “12760” 3、直接杀死进程 taskkill /F /pid 12760或 taskkill /F …

Mysql中DATETIME字段设置自动更新

在MySQL里&#xff0c;我们可以设置默认时间值来让数据表记录当时数据表更新时间。 在创建表时设置。我们可以在创建表的时候&#xff0c;指定一个字段的默认值为当前时间CURRENT_TIMESTAMP 示例代码&#xff1a; CREATE TABLE test (id INT PRIMARY KEY AUTO_INCREMENT,crea…

yolov1:背景介绍与算法精讲

目录 一、背景介绍1.1 yolo发展历史1.2 作者介绍 二、算法精讲2.1 预测阶段2.2 训练阶段 三、论文细节 一、背景介绍 其实在写这篇博客的时候yolov1~yolov8的所有网络结构以及算法思想和源码都已经研究很久了&#xff0c;回过头继续读v1会发现有很多细节是自己没有留意的&#…

Windows10解决大小核调度问题

文章目录 1.开启高性能模式2.下载安装PowerSettingsExplorer3.修改配置生效的异类策略异类线程调度策略异类短时间线程调度策略 4.你的电源策略5.CPU展示 该教程是给笔记本电脑用的&#xff0c;经过我实践是成功的。 1.开启高性能模式 使用管理员模式的PowerShell输入下列指令 …

Mantle: A Programmable Metadata Load Balancer for the Ceph File System——论文泛读

SC 2015 Paper 元数据论文阅读汇总 问题 优化Ceph的元数据局部性和负载平衡。 现有方法 提高元数据服务性能的最常见技术是在专用的元数据服务器&#xff08;MDS&#xff09;节点之间平衡负载 [16, 25, 26, 21, 28]。常见的方法是鼓励独立增长并减少通信&#xff0c;使用诸…

HuiYong.Online 私有化博客系统

HuiYong.Online 私有化博客系统 一站式支持MarkDown、Drawio、XMind 免费、简单、强大... 用思维导图、流程图、写文章、做笔记、记录生活;搭建自己 / 组织 / 公司的知识储备系统;这里就是你所寻找的。 链接 官网&#xff1a;https://huiyong.onlineGithub&#xff1a;http…

【iOS】数据存储方式总结(持久化)沙盒结构

在iOS开发中&#xff0c;我们经常性地需要存储一些状态和数据&#xff0c;比如用户对于App的相关设置、需要在本地缓存的数据等等&#xff0c;本篇文章将介绍六个主要的数据存储方式 iOS中数据存储方式&#xff08;数据持久化&#xff09; 根据要存储的数据大小、存储数据以及…