洛谷 [P4011] 孤岛营救问题
状压+BFS
通过观察数据范围可知,我们应该状压钥匙种类,直接BFS即可
注意,一个点处可能不知有一把钥匙
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <queue>
using namespace std;
bool f[14][14][1200];
int n,m,p,k,s,key[15][15],block1[15][15],block2[15][15],dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
struct pa{
int x,y,key,tim;
};
queue<pa> q;
int main(){
cin>>n>>m>>p;
cin>>k;
for(int i=1;i<=k;i++){
int a1,a2,b1,b2,g;
cin>>a1>>b1>>a2>>b2>>g;
if(!g) g=50;
if(a1==a2) block1[a1][min(b1,b2)]=g;
else block2[min(a1,a2)][b1]=g;
}
cin>>s;
for(int i=1;i<=s;i++){
int a,b,ty;
cin>>a>>b>>ty;
key[a][b]=key[a][b]|(1<<(ty-1));
}
/* for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",block2[i][j]);
}
printf("\n");
}*/
pa a;
a.x=1;a.y=1;a.key=key[1][1];a.tim=0;
q.push(a);f[1][1][a.key]=1;
while(!q.empty()){
pa u=q.front();q.pop();
//printf("%d %d %d u\n",u.x,u.y,u.key);
for(int i=0;i<4;i++){
int x=u.x+dx[i],y=u.y+dy[i];
if(x>0&&x<=n&&y>0&&y<=m){
if(((i==1)||(i==2))&&block1[min(x,u.x)][min(y,u.y)]){
if(block1[min(x,u.x)][min(y,u.y)]==50) continue;
if(!((u.key>>(block1[min(x,u.x)][min(y,u.y)]-1))&1)) continue;
}
if(((i==0)||(i==3))&&block2[min(x,u.x)][min(y,u.y)]){
if(block2[min(x,u.x)][min(y,u.y)]==50) continue;
if(!((u.key>>(block2[min(x,u.x)][min(y,u.y)]-1))&1)) continue;
}
pa v;
v.x=x;v.y=y;v.key=u.key|key[x][y];v.tim=u.tim+1;
if(!f[x][y][v.key]) q.push(v),f[x][y][v.key]=1;
if(x==n&&y==m){
printf("%d\n",v.tim);
return 0;
}
}
}
}
printf("-1\n");
return 0;
}
洛谷 [P4011] 孤岛营救问题的更多相关文章
- 洛谷 P4011 孤岛营救问题【最短路+分层图】
题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...
- 洛谷P4011 孤岛营救问题(状压+BFS)
传送门 和网络流有半毛钱关系么…… 可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解 然后是某大佬说的注意点:每个 ...
- 洛谷 P4011 孤岛营救问题【bfs】
注意: 一个点可能有多把钥匙,所以把每个点有钥匙的情况状压一下 两个点之间有障碍的情况只给出了单向,存的时候记得存一下反向 b[i][j]表示当前点拥有钥匙的状态,g[x1][y1][x2][y2]表 ...
- Luogu P4011 孤岛营救问题(状态压缩+最短路)
P4011 孤岛营救问题 题意 题目描述 \(1944\)年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到 ...
- 洛谷P4011 【网络流24题】 孤岛营救问题 (BFS+状压)
一道妙题啊......(不知道为什么这道题的标签是网络流,不需要用网络流啊) 如果没有门和钥匙,连边(边权为1)求最短路就行了. 但是有这两个因素的限制,我们采用分层建图的思想,一共2p层,每层对应持 ...
- P4011 孤岛营救问题
\(\color{#0066ff}{题目描述}\) 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克 ...
- Luogu P4011 孤岛营救问题
题目链接 \(Click\) \(Here\) 注意坑点:一个地方可以有多把钥匙. 被卡了一会,调出来发现忘了取出来实际的数字,直接把二进制位或上去了\(TwT\),其他的就是套路的分层图最短路.不算 ...
- 「LOJ#6121」「网络流 24 题」孤岛营救问题(BFS
题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形 ...
- 洛谷 P1396 营救
题目链接 https://www.luogu.org/problemnew/show/P1396 题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪 ...
随机推荐
- Spring最核心的功能是什么?使用Spring框架的最核心的原因是什么?
quote:Spring最核心的功能是什么?使用Spring框架的最核心的原因是什么? (IT公司面试手册,可以多看看) spring 框架中核心组件有三个:Core.Context 和 Beans. ...
- [学习OpenCV攻略][007][缩小图片]
cvPryDown(输入图片,输出图片) 根据输出图片的大小,把输入图片进行压缩 cvPryUp(输入图片,输出图片) 根据输出图片的大小,把输入图片进行放大 #include "cv.h& ...
- 通过Git Gui Here上传本地项目到GitHub上
要使用此种方法上传本地项目到GitHub上,前提得是你已安装Git for window工具. Git for window下载地址:http://www.xp510.com/xiazai/Appli ...
- 配置国内PIP源方法
python开发者都知道,当我们pip install安装扩展库的时候,经常遇到安装失败(超时)等,有时候是因为国外镜像被屏蔽了,带来不少麻烦, 随着国内python开发的增多,越来越多企业都开放了自 ...
- 我的flashfxp左右界面怎么变成这样了?
如下图,flashfxp不是说左边是本地的文件夹,右边是服务器上的文件夹的吗?我不懂刚刚怎么搞了一下,变成两边都是服务器上的文件夹了,哪位大神,指点下,谢谢!!! 921050734 | 浏览 168 ...
- [field:softlinks/]逻辑过程
在plus/download.php 在dededln\include\taglib\channel\softlinks.lib.php
- NSUserDefaults standardUserDefaults使用注意事项
NSUserDefaults可以存储NSString,NSNumber, NSDate, NSArray, NSDictionary,自定义类可以通过NSData的方式进行存储,当然要实现NSCodi ...
- wigs的理解和应用
1. 首先了解下,Web应用的本质,大体如下: 1.浏览器发送一个HTTP请求: 2.服务器收到请求,生成一个HTML文档: 3.服务器把HTML文档作为HTTP响应的Body发送给浏览器: 4.浏览 ...
- JS动态获取当前时间
HTML部分: <div class="div"> <div id="div"> </div> </div> C ...
- RequestParam\@ResponseBody
为什么不写 RequestParam 也能拿到参数 三种写法,test(String name), test(@RequestParam String name), test(@RequestPara ...