P4011 孤岛营救问题

P4011 孤岛营救问题

文章目录

  • 输入输出样例
  • 题意:
  • 题解:
    • 代码:

输入输出样例

输入

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

题意:

(原题太长我就不贴了,简单叙述一下)
一个N*M的迷宫,每个单元格之间可能有门或者墙,也可能啥也没有。门和墙的总数为K(会读入墙和门的位置坐标)
门存在种类,只有拥有对应种类的钥匙才可以打开这类门
钥匙的总量为S(会读入钥匙的坐标)
从一个单元格到另一个单元格时间为1
现在从左上角(1,1)出发,到右下角(N,M),最少花费多少时间?
针对样例,看图分析
在这里插入图片描述
紫色为钥匙
橙色为墙或者门的种类
绿色为线路

题解:

这就是网络流吗?爱了爱了
迷宫的题一般用BFS就可以做
有了钥匙我们就状压+BFS
状态压缩钥匙,是为了方便记录每一把钥匙的状态
就比如当前状态是“100”,说明我有第三把钥匙,因为第三位(从右往左)是1,而“100”对应的是4,你会发现你拥有第i把钥匙,状态就是2i-1(十进制下),这样我们就可以用二进制来存储钥匙信息
key|=Key [ x ] [ y ] //就是将当前已有钥匙的状态给key
我们在开门时验证自己有钥匙的方式:
( mp [x] [y] [u.x] [u.y] & key ) ! = mp [x] [y] [u.x] [u.y]
[x][y]表示当前单元格,[u.x][u.y]表示上一个单元格
mp就表示两个单元格之间门的编号,也可能是墙(表示方式和钥匙一样),直接与钥匙&运算,如果运算后还是本身,说明有指定的钥匙(因为有钥匙说明那一位为1,1&1=1,还是本身,如果没有指定钥匙,说明那一位是0,0&1=0,值就发生改变)

然后就是bfs的走迷宫过程,走迷宫有四种状态要continue
1.如果超格子了
2.如果撞墙了
3.如果遇到门但是木有钥匙
4.之前走过了

坑点:
1.钥匙可以重复使用而非用过即毁
2.一个地方可以存放多个钥匙,所以保存钥匙时不要将前一个覆盖掉
3.初始点也可以放钥匙
4.存在走不通的情况记得输出-1

代码:

代码中注释非常详细

#include<bits/stdc++.h>
using namespace std;
const int dx[]={1,-1,0,0};//增量数组
const int dy[]={0,0,1,-1};
int vis[25][25][40005],x,y,xx,yy,p,pw[105],mp[16][16][16][16],Key[20][20],n,m,tot;
struct nod{int x,y,key,stp;}q[5000005];//q为广搜用的队列
int bfs(){int h=1,t=1;vis[1][1][Key[1][1]]=1;//一开始就有位于(1,1)的钥匙q[t]=(nod){1,1,Key[1][1],0};for(;h<=t;++h){nod u=q[h];//取队头for(int k=0;k<4;++k){int x=u.x+dx[k];int y=u.y+dy[k];int key=u.key;//已有钥匙 int stp=u.stp;//已走步数 if(x<1||y<1||x>n||y>m)continue;//如果超出格子则跳过if(mp[x][y][u.x][u.y]==-1)continue;//如果两个格子之间有墙则跳过if((mp[x][y][u.x][u.y]&key)!=mp[x][y][u.x][u.y])continue;//如果两个格子之间有门而且手上所有的钥匙里没有能打开该门的钥匙则跳过key|=Key[x][y];//更新已有钥匙的情况 if(vis[x][y][key])continue;//如果之前搜到过这个状态则跳过vis[x][y][key]=1;stp++;//可以则扩展q[++t]=(nod){x,y,key,stp};//保存当前坐标,以及钥匙与步伐情况 if(x==n&&y==m)return stp;//如果已经走到(n,m)则返回答案}}return -1;//无法抵达
}
int main(){pw[1]=1;for(int i=2;i<=15;++i)pw[i]=pw[i-1]<<1;//预处理pw数组scanf("%d%d%d",&n,&m,&p);scanf("%d",&tot);while(tot--){scanf("%d%d%d%d%d",&x,&y,&xx,&yy,&p);if(p==0){mp[x][y][xx][yy]=mp[xx][yy][x][y]=-1;}else {mp[x][y][xx][yy]=mp[xx][yy][x][y]=pw[p];//将门的标号更新到指定位置 }}int q; scanf("%d",&tot);while(tot--){scanf("%d%d%d",&x,&y,&q);Key[x][y]|=pw[q];//表示在(x,y)点上有编号为q的钥匙,将钥匙的编号更新到指定坐标 }cout<<bfs();return 0;
}

这个题我就用两个字形容:绝了
很久没有遇到这么好的题

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

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

相关文章

[NOI2014] 起床困难综合症(二进制,贪心)

#include<bits/stdc.h> int n,m,ans,x,a10,a2-1; //-1的补码:11111111111... char str[5]; int main(){scanf("%d%d",&n,&m);while(n--){scanf("%s%d",str,&x);if(str[0]A) a1&x, a2&x;if(str[0]X) a1^x, a2^x;if(str[0]O) a1|…

P4015 运输问题

P4015 运输问题 文章目录题目描述&#xff1a;输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a;题解&#xff1a;代码&#xff1a;题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 两行分别输出最小运输费用和最大运输费用。 输入输出样例…

NetCore使用Jwtbearer给WebAPI添加访问控制

现在JWT代替session来做访问控制已经成为大部分webapi的做法&#xff0c;今天我们也来尝试一下WebAPI使用NetCore2.1创建,无身份认证信息nuget安装包IdentityModel 选择稳定版3.9.0Microsoft.AspNetCore.Authorization 版本2.1.1Microsoft.AspNetCore.Authentication.JwtBearer…

图论复习——网络流

最大流 与 最小费用最大流 Blog 有上下界网络流 Blog 最小割 Blog 模拟费用流 CF724E Goods transportation 摘自此Blog 建图优化 若同一行或者同一列的点互相可达&#xff0c;那么其实不需要两两连边&#xff0c;只需要对于每行和每列建一个辅助节点作为中转 [ARC…

离散大创项目——图片识别笔记

1.我才知道ainput()读入的竟然是字符串。。。还要强制转化成int型&#xff0c;这玩意搞了我好久 2.对照片进行裁剪&#xff0c;将照片周围多余的白色部分去除&#xff08;也就是让图像尽可能撑满整个框&#xff09; 由上一张裁成下一张 from PIL import Image import os SCA…

最小割小记

参考博客&#xff1a;最小割浅谈 关于最小割 常用描述 表述一&#xff1a;删去若干条边使得源点到汇点不连通&#xff0c;求删边的权值和的最小可能值。 表述二&#xff1a;将点集分为(S,T)(S,T)(S,T)&#xff0c;记所有从SSS中出发到TTT中的边的权值和为c(S,T)c(S,T)c(S,T)&a…

斐波那契数列求法

文章目录求斐波那切数列的几个方法&#xff1a;经典做法&#xff1a;递推&#xff1a;动态规划矩阵快速幂原理&#xff1a;代码&#xff1a;例题&#xff1a;模拟过程求斐波那切数列的几个方法&#xff1a; 经典做法&#xff1a; 众所周知&#xff1a;斐波那契数列的定义是f(…

ASP.Net Core2.1中的HttpClientFactory系列一

引言&#xff1a;ASP.NET Core2.1 中出现了一个新的 HttpClientFactory 功能, 它有助于解决开发人员在使用 HttpClient 实例从其应用程序中访问外部 web 资源时可能遇到的一些常见问题。关于HttpClientFactory 到底解决了那些HttpClient的严重问题&#xff0c;下面是我罗列出来…

最大子矩阵(普通和01)

文章目录普通矩阵&#xff08;单个矩阵值为任何数&#xff09;最大子段和扩展到二维情况01矩阵&#xff08;单个矩阵值为0或1&#xff09;代码&#xff1a;普通矩阵&#xff08;单个矩阵值为任何数&#xff09; 例题&#xff1a;POJ 1074 求出其中最大的子矩阵 答案是&#x…

自动化流程开源框架BotSharp

BotSharp是一款为方便构建智能对话机器人平台而开发的开源框架&#xff0c;最大的特点是所有模型算法都是基于.NET Core开发实现&#xff0c;甚至最基本的Penn Treebank分词标准&#xff0c;都重新用C#实现了。在机器学习python占绝对优势的时代算是不可多得的项目。该项目涉及…

积极参与开源项目,促进.NET Core生态社区发展

今天早上在微信群里聊天聊到百度的SDK 已经支持.NET Core, 百度已经在3月份就支持了&#xff0c;想起当时还是我在他们的github上提的issue&#xff1a; https://github.com/Baidu-AIP/dotnet-sdk/issues/3。.NET Core生态社区的发展已经四年多时间&#xff0c;日趋完善&#x…

Service Fabric 与Ocelot 的集成

概要云应用程序通常都需要使用前端网关&#xff0c;为用户、设备或其他应用程序提供同一个入口点。 在 Service Fabric 中&#xff0c;网关可以是任意无状态服务&#xff08;如 ASP.NET Core 应用程序&#xff09; 。本文介绍了如何将Ocelot用作 Service Fabric 应用程序的网关…

图论复习——最短路

知识点 最短路径算法 最短路径树 每个点uuu的父亲为使uuu得到最短距离的前驱节点&#xff0c;若有多个&#xff0c;则取任意一个。 题目 CF449B Jzzhu and Cities Blog CF464E The Classic Problem Blog [XSY3888] 传送门 对每个点uuu&#xff0c;记d(u)d(u)d(u)表示uuu…

T-Dongle-S3开发笔记——创建工程

创建Hello world工程 打开命令面板 方法1&#xff1a;查看->命令面板 方法2&#xff1a;按F1 选择ESP-IDF:展示示例项目 创建helloworld 选择串口 选择芯片 至此可以编译下载运行了 运行后打印的信息显示flash只有2M。但是板子上电flash是W25Q32 4MB的吗 16M-bit

hdu 1576 A/B

文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;hdu 1576题目&#xff1a; 要求(A/B)%9973&#xff0c;但由于A很大&#xff0c;我们只给出n(nA%9973)(我们给定的A必能被B整除&#xff0c;且gcd(B,9973) 1)。 Input 数据的第一行是一个T&#xff0c;表示有T组数据。…

ASP.NET Core 中断请求了解一下(翻译)

本文所讲方式仅适用于托管在Kestrel Server中的应用。如果托管在IIS和IIS Express上时&#xff0c;ASP.NET Core Module(ANCM)并不会告诉ASP.NET Core在客户端断开连接时中止请求。但可喜的是&#xff0c;ANCM预计在.NET Core 2.2中会完善这一机制。1. 引言假设有一个耗时的Act…

.net core实践系列之短信服务-架构优化

前言通过前面的几篇文章&#xff0c;讲解了一个短信服务的架构设计与实现。然而初始方案并非100%完美的&#xff0c;我们仍可以对该架构做一些优化与调整。同时我也希望通过这篇文章与大家分享一下&#xff0c;我的架构设计理念。源码地址&#xff1a;https://github.com/SkyCh…

游戏 (博弈论)

https://blog.csdn.net/Mys_C_K/article/details/91443390

.NET Core中Object Pool的简单使用

前言复用&#xff0c;是一个重要的话题&#xff0c;也是我们日常开发中经常遇到的&#xff0c;不可避免的问题。举个最为简单&#xff0c;大家最为熟悉的例子&#xff0c;数据库连接池&#xff0c;就是复用数据库连接。那么复用的意义在那里呢&#xff1f;简单来说就是减少不必…

.Net Core应用框架Util介绍(三)

上篇.Net Core应用框架Util介绍&#xff08;二&#xff09;介绍了Util的开发环境&#xff0c;并让你把Demo运行起来。本文将介绍该Demo的前端Angular运行机制以及目录结构。目录结构在VS上打开Util Demo&#xff0c;会看见如下的目录结构。现代前端通常采用VS Code开发&#xf…