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]. 题目思路:利用最小费优先队列优化最短路 ...
随机推荐
- jQuery的基础跟JS的正则
大家好,我是唯芸星,这是我的一点点学过的知识,呈现给大家 1:正则表达式 包括: 1:正则表达式包括两部分 ①:定义正则表达式的规则 ②:正则表达式的规模(i/g/ ...
- 极化码的matlab仿真(2)——编码
第二篇我们来介绍一下极化码的编码. 首先为了方便进行编码,我们需要进行数组的定义 signal = randi([0,1],1,ST); %信息位比特,随机二进制数 frozen = zeros(1, ...
- JavaScript学习日志(二):面向对象的程序设计
1,ECMAScript不像其他面向对象的语言那样有类的概念,它的对象与其他不同. 2,ECMAScript有两种属性:数据属性和访问器属性.([[]]这种双中括号表示属性为内部属性,外部不可直接访问 ...
- 基于NIOS-II的示波器:PART4 系统调试&测试
本文记录了在NIOS II上实现示波器的第四部分. 本文主要包括:修改部分BUG,以及测试 本文所有的硬件以及工程参考来自魏坤示波仪,重新实现驱动并重构工程. version 1.0 界面修改& ...
- 电商Banner设计背后的12个人性的秘密
- java环境安装说明
Java从安装到运行第一个程序 对于初学者来说,能否成功运行第一个Java程序,关系到这杯咖啡的口感. 作为才疏学浅的常年初学者,语言描述不清,还是上图吧! 一.安装JDK 打开网址http://ww ...
- Swing-setOpaque()用法-入门
先看API: public void setOpaque(boolean isOpaque) 如果为 true,则该组件绘制其边界内的所有像素.否则该组件可能不绘制部分或所有像素,从而允许其底层像素透 ...
- 201521123081《java程序设计》 第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料:XMind 2. 书面作业 Q1. ArrayList代码分析 1.1 解释ArrayList的 contains ...
- 201521123078 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 1.题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常. ...
- Hibernate第八篇【懒加载】
前言 前面在使用Hibernate的时候就提及过了懒加载,但没有好好地说明具体的说明究竟是怎么回事-本博文主要讲解懒加载 什么是拦截器以及为什么要使用懒加载? 懒加载就是当使用数据的时候才去获取数据. ...