Prison Break
Prison Break
时间限制: 1 Sec 内存限制: 128 MB
提交: 105 解决: 16
[提交][状态][讨论版]
题目描述
Scofild又要策划一次越狱行动,和上次一样,他已经掌握了整个监狱的地图,看守的位置,以及准备好了逃出监狱的出口。由于消息被其他监狱中的囚犯得知了,为了不泄露消息,他不得不将所有人带出监狱。
这是一个月黑风高的夜晚。。。看守们都已经睡着,在没有罪犯打扰的情况下绝对不会醒来,即罪犯不能到达看守所在位置。在每一个空地中,都有一名罪犯,并且同一个空地,能容纳无穷多个罪犯。每个人都只能向东南西北四个方向移动。在地图中某些位置,有一些出口,当罪犯到达出口,就视为逃出监狱,并且出口每一秒钟最多能逃出1个罪犯。现在越狱行动开始。。。Scofild需要安排一个越狱计划,使得大家能尽快的逃出监狱。此时,监狱的监控发现了情况,监狱外的警察,将在T秒后到达现场,并封锁所有出口。现在Scofild想要知道所有人能否成功越狱,如果能,计算出所需的最短的越狱时间,使得最后一个人逃出监狱的时间尽量的短。
输入
第一行三个整数r,c,T(3 <= r, c <= 12)
接下来r行字符,每行c列。‘.’表示一个空地,一开始该点有一名罪犯。‘X’表示警察的位置,并且他不能移动,罪犯也不能到达该点,否则他就会醒来并拉响警报。‘E’表示出口。
输出
1行,输出最少的越狱时间,如果在大批警察赶到之后还有人无法逃离,则输出“impossible”。
样例输入
样例输出
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std; typedef pair<int,int>fzy;
const int NN=*+; int n,m,T,ckt=,ckq=;
int dis[NN][NN],flag[NN*],fa[NN*];
char c[][];
bool boo[][];
int cb[][]={};
struct node
{
int x,y,flag;
}out[NN],qf[NN];
int cnt,head[NN*],next[],rea[]; void add(int u,int v)
{
cnt++;
next[cnt]=head[u];
head[u]=cnt;
rea[cnt]=v;
}
bool dfs(int u)
{
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i];
if (flag[v]==)
{
flag[v]=;
if (fa[v]==-||dfs(fa[v]))
{
fa[v]=u;
return ;
}
}
}
return ;
}
void bfs(int i)
{
queue<fzy>q;
queue<int>p;
memset(boo,,sizeof(boo));
boo[qf[i].x][qf[i].y]=;
while (!q.empty()) q.pop();
while (!p.empty()) p.pop();
q.push(make_pair(qf[i].x,qf[i].y));
p.push();
while (!q.empty())
{
fzy now=q.front();
int vis=p.front();
q.pop(),p.pop();
int x=now.first,y=now.second;
if (c[x][y]=='E') dis[i][cb[x][y]]=vis;
if (x->=&&c[x-][y]!='X'&&boo[x-][y]==)
{
boo[x-][y]=;
q.push(make_pair(x-,y));
p.push(vis+);
}
if (x+<=n&&c[x+][y]!='X'&&boo[x+][y]==)
{
boo[x+][y]=;
q.push(make_pair(x+,y));
p.push(vis+);
}
if (y->=&&c[x][y-]!='X'&&boo[x][y-]==)
{
boo[x][y-]=;
q.push(make_pair(x,y-));
p.push(vis+); }
if (y+<=m&&c[x][y+]!='X'&&boo[x][y+]==)
{
boo[x][y+]=;
q.push(make_pair(x,y+));
p.push(vis+);
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&T);
memset(dis,-,sizeof(dis));
for (int i=;i<=n;i++)
scanf("%s",c[i]+);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (c[i][j]=='E')
{
out[++ckt].flag=ckt;
out[ckt].x=i,out[ckt].y=j;
cb[i][j]=ckt;
}
else if (c[i][j]=='.')
{
qf[++ckq].x=i;
qf[ckq].y=j;
}
for (int i=;i<=ckq;i++) bfs(i);
int l=,r=T+;
while (l<r)
{
int mid=(l+r)/;
cnt=;
memset(head,-,sizeof(head));
for (int i=;i<=ckq;i++)
for (int j=;j<=ckt;j++)
if (dis[i][j]!=-)
for (int k=dis[i][j];k<=mid;k++)
add(i,(j-)*mid+k);
int res=;
memset(fa,-,sizeof(fa));
for (int i=;i<=ckq;i++)
{
memset(flag,,sizeof(flag));
res+=dfs(i);
}
if (res==ckq) r=mid;
else l=mid+;
}
if (l==)
{
cout<<<<endl;
return ;
}
if (l==T+) printf("impossible");
else printf("%d\n",l);
}
Prison Break的更多相关文章
- HDU 3681 Prison Break(BFS+二分+状态压缩DP)
Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...
- hdu 3681 Prison Break (TSP问题)
Prison Break Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- hdu 3681 Prison Break(状态压缩+bfs)
Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...
- hdu3511 Prison Break 圆的扫描线
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=3511 题目: Prison Break Time Limit: 10000/5000 MS ( ...
- HDU3681 Prison Break
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- 1254 - Prison Break
1254 - Prison Break PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Mic ...
- HDU 3681 Prison Break(状态压缩dp + BFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 前些天花时间看到的题目,但写出不来,弱弱的放弃了.没想到现在学弟居然写出这种代码来,大吃一惊附加 ...
- hdu 3681 Prison Break
http://acm.hdu.edu.cn/showproblem.php?pid=3681 题意:一个n*m的矩阵,'F'是起点.机器人从F出发,走到G可以充电,走到Y关掉开关,D不能走进,要求把所 ...
- light oj 1254 - Prison Break 最短路
题目大意:n个点m条边的有向图,q次询问c,s,t,表示汽车邮箱容量为c,求从起点s到终点t的最小费用.汽车在每个点可以加任意的油,每个点的单位油价为a[i]. 题目思路:利用最小费优先队列优化最短路 ...
随机推荐
- HTTP手记
---------------------tcp/ip模型和osi模型---------------------tcp/ip协议模型 osi模型应用层 应用层 表示层 会话层传输层 传输层 ...
- 谈谈.NET,Java,php
开通博客后,一直都是转点别的朋友写的有意思的博文,今天我来写我在博客园的第一篇文章,说的不对的地方请你指正.希望本文能为一些准备学习编程的朋友有一点帮助. 开发桌面程序一直都是c语言,c++的天下,因 ...
- NET .NET深入体验和实战精要
在学习.NET之前要充分理解基础,在这里将基础的知识点一一列举. 万丈高楼平地起 1.命名空间 命名空间是一种特殊的分类机制,他将与一个特定功能集有关的所有类型都分到一起,是.避免类名冲突的一种方式 ...
- ReentrantLock和synchronized的性能对比
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo8 ReentrantLock和内部锁的性能对比 Reentran ...
- [转]Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp84 Random即:java.util.Random, ThreadL ...
- Linux-insmod/rmmod/lsmod驱动模块相关命令(10)
insmod:加载模块 参数: -f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入.-k 将模块设置为自动卸除.-m 输出模块的载入信息.-o <模块名称 ...
- Push or Pull?
采用Pull模型还是Push模型是很多中间件都会面临的一个问题.消息中间件.配置管理中心等都会需要考虑Client和Server之间的交互采用哪种模型: 服务端主动推送数据给客户端? 客户端主动从服务 ...
- 改造百度ueditor字体为rem及相关体会
提到富文本,可能大家都用到过百度的ueditor,作为一个重量级的插件,总结起来一句话,功能很强大,使用很费心.不知道是不是太久没有维护了,ueditor的文档可读性还真是差也可能是悟性不够吧.本文也 ...
- PHP初入--表单元素
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.4.27
2017.04.27 天气阴沉 小雨. 时间:上午 9:35 ---10:10分 地点:陆大314实验室 会议内容:每天充分利用好大课间的时间,今天对昨天的的细节问题进行了讨论及方法更正.时间不等人这 ...