洛谷 [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 题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪 ...
随机推荐
- 状压dp初探
写了几道状压...然后就一直在颓废... 2064: 分裂 http://www.lydsy.com/JudgeOnline/problem.php?id=2064 初始的为正,最后的为负,假设我们能 ...
- poj_1144Network(tarjan求割点)
poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...
- FineReport父子格实现动态参数注入
"深入学习FineReport后发现其功能及其强大,之前使用存储过程实现的报表完全可以使用FineReport本身的功能实现. 当你需要的表名,查询条件等均未知的时候,使用"动态参 ...
- 安装配置最强Spark IDE--IDEA
1.安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示 ...
- JS验证两次输入密码是否相同
js中 <script>function check(){ with(document.all){if(input1.value!=input2.value){alert("fa ...
- 访问taotao-portal 中controller中返回taotaoresult 测试httppost方法 出现406错误
方案:1.检查jackson包是否存在 @controller @RequestMapping(value = "/httpclient/post",method=RequestM ...
- 访问Google工具
借助Google访问助手加速 下载地址: http://www.ggfwzs.com/
- WPF 文本滚动效果 渐变效果
<DockPanel> <StackPanel DockPanel.Dock="Bottom" VerticalAlignment="Bottom&qu ...
- Linux命令之远程下载命令:wget
转自:http://www.cnblogs.com/peida/archive/2013/03/18/2965369.html Linux系统中的wget是一个下载文件的工具,它用在命令行下.对于Li ...
- 在js中怎样获得checkbox里选中的多个值?
https://zhidao.baidu.com/question/203897221.html 思路:利用name属性值获取checkbox对象,然后循环判断checked属性(true表示被选中, ...