洛谷 [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 题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪 ...
随机推荐
- c++工程重复编译与重复定义
#ifndef #define #endif防止的是"重复编译",而不是"重复定义"重复编译可能造成重复定义,但重复定义的来源不只有重复编译从代码变成可执行的程 ...
- Ceph部署(一)集群搭建
背景 Ceph简介 Ceph是一个分布式存储,可以提供对象存储.块存储和文件存储,其中对象存储和块存储可以很好地和各大云平台集成.一个Ceph集群中有Monitor节点.MDS节点(可选,用于文件存储 ...
- mysql数据库备份及还原
数据库备份代码: package com.gd.test; import java.io.BufferedReader; import java.io.FileOutputStream; import ...
- myeclipse中git的使用
1.右键项目,team-->commit,勾选修改了的文件,点击commit(将更新提交到本地仓库)2.右键项目,team-->pull,合并本地仓库和远程服务器仓库,pull后有一些文件 ...
- 关于keil5使用注意事项(预定义、路径包含)
2017.12.17 下午 终于在不用keil5自带添加库的基础上0 error的新建了一个工程.磕磕绊绊搞了快一个下午,各种小问题搞到崩溃. 首先是库文件添加路径的问题 ,只要是你工程中用到的头文 ...
- nginx 防火墙、权限问题
1.nginx安装,配置完成之后,尝试访问没有响应,主机可以ping通,/var/log/nginx/access.log日志没有查到任何记录 解决方法:查看linux防火墙,关闭 命令:ipta ...
- 一个简洁的PHP可逆加密函数(分享)
http://www.jb51.net/article/38018.htm 本篇文章是对一个简洁的PHP可逆加密函数进行了详细的分析介绍,需要的朋友参考下 很多时候我们需要对数据进行加密解密,比如 ...
- NSMutableArray 记住取不到时要进行强转
NSMutableArray 记住取不到时要进行强转
- 您是不是奇怪为什么 <script> 标签中没有 type="text/javascript" 属性?
在 HTML5 中该属性不是必需的.JavaScript 是 HTML5 以及所有现代浏览器中的默认脚本语言!
- action之间传参为中文;type='redirect'和 type='redirectAction'主要区别
摘录自:http://blog.csdn.net/lhi705/article/details/7446156 Struts2中action之间传参中文乱码的问题 解决方法一(已经验证,可以): 两个 ...