注意:

  • 一个点可能有多把钥匙,所以把每个点有钥匙的情况状压一下
  • 两个点之间有障碍的情况只给出了单向,存的时候记得存一下反向

b[i][j]表示当前点拥有钥匙的状态,g[x1][y1][x2][y2]表示两点之间门的类型(0表示没有,-1表示墙比较方便),f[i][j][k]表示点(i,j)在拥有k状态钥匙的情况下的最小步数,v[i][j][k]表示f[i][j][k]的状态是否在bfs队列里。然后转移比较类似spfa

以及终于知道为什么这种题会在24题里了…因为24全名“网络流与线性规划二十四题”…

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int inf=1e9,dx[]={1,-1,0,0},dy[]={0,0,-1,1};
int n,m,p,t,s,g[15][15][15][15],b[15][15],f[15][15][20005];
bool v[15][15][20005];
struct qwe
{
int x,y,s;
}now;
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int main()
{
n=read(),m=read(),p=read(),t=read();
for(int i=1;i<=t;i++)
{
int x1=read(),y1=read(),x2=read(),y2=read(),z=read();
z=z==0?-1:z;
g[x1][y1][x2][y2]=z;g[x2][y2][x1][y1]=z;
}
s=read();
for(int i=1;i<=s;i++)
{
int x=read(),y=read(),z=read();
b[x][y]=b[x][y]|(1<<z);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<(1<<14);k++)
f[i][j][k]=inf;
queue<qwe>q;
now.x=1,now.y=1,now.s=b[1][1];
f[1][1][now.s]=0;
v[1][1][now.s]=1;
q.push(now);
while(!q.empty())
{
int x=q.front().x,y=q.front().y,z=q.front().s;
v[x][y][z]=0;
q.pop();
for(int i=0;i<4;i++)
{
int x1=x+dx[i],y1=y+dy[i];
if(x1<1||x1>n||y1<1||y1>m||g[x][y][x1][y1]==-1||(g[x][y][x1][y1]>0&&!((1<<g[x][y][x1][y1])&z)))
continue;
int w=z|b[x1][y1];//cout<<x1<<" "<<y1<<" "<<w<<" "<<f[x1][y1][w]<<endl;
if(f[x1][y1][w]>f[x][y][z]+1)
{
f[x1][y1][w]=f[x][y][z]+1;
if(!v[x1][y1][w])
{
now.x=x1,now.y=y1,now.s=w;
v[x1][y1][w]=1;
q.push(now);
}
}
}
}
int ans=inf;
for(int i=0;i<(1<<14);i++)
ans=min(ans,f[n][m][i]);
printf("%d\n",ans==inf?-1:ans);
return 0;
}

洛谷 P4011 孤岛营救问题【bfs】的更多相关文章

  1. 洛谷P4011 孤岛营救问题(状压+BFS)

    传送门 和网络流有半毛钱关系么…… 可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解 然后是某大佬说的注意点:每个 ...

  2. 洛谷 [P4011] 孤岛营救问题

    状压+BFS 通过观察数据范围可知,我们应该状压钥匙种类,直接BFS即可 注意,一个点处可能不知有一把钥匙 #include <iostream> #include <cstdio& ...

  3. 洛谷 P4011 孤岛营救问题【最短路+分层图】

    题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...

  4. Luogu P4011 孤岛营救问题(状态压缩+最短路)

    P4011 孤岛营救问题 题意 题目描述 \(1944\)年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到 ...

  5. 孤岛营救问题(BFS+状压DP)

    孤岛营救问题 https://www.luogu.org/problemnew/show/P4011 用状压DP标记拿到钥匙的数量 #include<iostream> #include& ...

  6. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

  7. 洛谷P4011 【网络流24题】 孤岛营救问题 (BFS+状压)

    一道妙题啊......(不知道为什么这道题的标签是网络流,不需要用网络流啊) 如果没有门和钥匙,连边(边权为1)求最短路就行了. 但是有这两个因素的限制,我们采用分层建图的思想,一共2p层,每层对应持 ...

  8. P4011 孤岛营救问题

    \(\color{#0066ff}{题目描述}\) 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克 ...

  9. 洛谷P1126机器人搬重物[BFS]

    题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...

随机推荐

  1. centos 中找不到 php-config

    两种解决方式: 1.CentOS6 PHP extension install: Cannot find php-config. Please use --with-php-config=PATH 2 ...

  2. 毕业bg--hdu1881(01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1881 01 背包  先按发起人离开的时间从小到大排序 然后再套01背包的模板 #include <iost ...

  3. 通过XMLHttpRequest,ActiveXObject实现ajax请求

    今天学习了原生的ajax请求.我将涉及到的ajax请求方法封装成了一个对象: var xhr={     getXHR:function(){         var XHR = null;      ...

  4. web应用启动的时候SpringMVC容器加载过程

    <!-- 配置DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> ...

  5. ASP.NET Web Pages - 教程

    ASP.NET Web Pages - 教程 ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器脚本创建网页和网站的开发框架. ASP.NET 支持三种不同的开发模式:Web ...

  6. android JNI 资料大全

    AndroidJNI 通过C++调用JAVA 1. JNIEnv对象    对于本地函数    JNIEXPORT void JNICALL Java_video1_TestNative_sayHel ...

  7. hdu 5303 Delicious Apples

    这道题贪心 背包 假设在走半圆之内能够装满,那么一定优于绕一圈回到起点.所以我们从中点将这个分开,那么对于每一个区间由于苹果数非常少,所以能够利用pos[x]数组记录每一个苹果所在的苹果树位置,然后将 ...

  8. SQL yog过期后教你怎么让他不过期

    打开注册表  安装sqlyog后,进入注册表编辑器,进入\HEYK_CURRENT_USER\Software\,找到以{}括起来的那项直接干掉! 1, regedit 2,修改 3,

  9. ZOJ 3228 Searching the String (AC自己主动机)

    题目链接:Searching the String 解析:给一个长串.给n个不同种类的短串.问分别在能重叠下或者不能重叠下短串在长串中出现的次数. 能重叠的已经是最简单的AC自己主动机模板题了. 不能 ...

  10. 将C++的标识符转成OC的标识符

    3.将C++的标识符转成OC的标识符 C++的标识符和OC一样由数字字母下划线组成.打头的不是数字.当标识符超过一个单词, C++採用全字母小写.单词间用下划线连接的书写规范,如: bei_jing ...