HDU3681 Prison Break
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4867 Accepted Submission(s): 1329
The jail area is a rectangle contains n×m little grids, each grid might be one of the following:
1) Empty area, represented by a capital letter ‘S’.
2) The starting position of Micheal#1, represented by a capital letter ‘F’.
3) Energy pool, represented by a capital letter ‘G’. When entering an energy pool, Micheal#1 can use it to charge his battery ONLY ONCE. After the charging, Micheal#1’s battery will become FULL and the energy pool will become an empty area. Of course, passing an energy pool without using it is allowed.
4) Laser sensor, represented by a capital letter ‘D’. Since it is extremely sensitive, Micheal#1 cannot step into a grid with a laser sensor.
5) Power switch, represented by a capital letter ‘Y’. Once Micheal#1 steps into a grid with a Power switch, he will certainly turn it off.
In order to escape from the jail, Micheal#1 need to turn off all the power switches to stop the electric web on the roof—then he can just fly away. Moving to an adjacent grid (directly up, down, left or right) will cost 1 unit of energy and only moving operation costs energy. Of course, Micheal#1 cannot move when his battery contains no energy.
The larger the battery is, the more energy it can save. But larger battery means more weight and higher probability of being found by the weight sensor. So Micheal#1 needs to make his battery as small as possible, and still large enough to hold all energy he need. Assuming that the size of the battery equals to maximum units of energy that can be saved in the battery, and Micheal#1 is fully charged at the beginning, Please tell him the minimum size of the battery needed for his Prison break.
GDDSS
SSSFS
SYGYS
SGSYS
SSYSS
0 0
动态规划 状压DP 二分
停在普通点的状态肯定不需要保留,只记录每个特殊点(起点 开关 能量点)的位置,预处理出它们之间的距离。
压缩状态,f[bit][ter]表示当前到达过的点集为bit,停留在ter号点的最大剩余能量。
假定所有的点都只能停留一次(预处理时按可以多次经过来计算距离,而表示状态时多停留并没有用)
二分答案,判定是否可行
顺带一提,由于这份代码中用了大量STL,并且HDU貌似没有-O2,耗时成功垫底233
题目不算难,但状压dp细节好麻烦,位运算时候总是一眼花就写错变量,看好半天才能发现,就很气。
/*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int mxn=;
const int mx[]={,,,,-};
const int my[]={,,,-,};
int f[][<<];
char mp[][];
int n,m;
int sx,sy;
int yx[],yy[],yct=;
int b[],bct=;int tar;
int dis[][][][];
bool vis[][];
void init(){
memset(dis,0x3f,sizeof dis);
memset(f,-,sizeof f);
return;
}
void BFS(int sx,int sy){
dis[sx][sy][sx][sy]=;
memset(vis,,sizeof vis);
queue<pair<int,int> >q;
q.push(make_pair(sx,sy));
vis[sx][sy]=;
while(!q.empty()){
int x=q.front().first,y=q.front().second;q.pop();
for(int i=;i<=;i++){
int nx=x+mx[i],ny=y+my[i];
if(nx< || nx>n || ny< || ny>m)continue;
if(vis[nx][ny] || mp[nx][ny]=='D')continue;
vis[nx][ny]=;
dis[sx][sy][nx][ny]=dis[sx][sy][x][y]+;
q.push(make_pair(nx,ny));
}
}
return;
}
bool solve(int lim){
memset(f,-,sizeof f);
f[][]=lim;
int i,j,k,ed=(<<(yct+))-;
for(i=;i<=ed;i++){
for(j=;j<=yct;j++){
if(!(i&b[j]))continue;
if((i&tar)==tar && f[j][i]!=-)return ;
if(f[j][i]==-)continue;
for(k=;k<=yct;k++){
if(j==k || (i&b[k]))continue;
int dist=f[j][i]-dis[yx[j]][yy[j]][yx[k]][yy[k]];
if(dist<)continue;
f[k][i|b[k]]=max(f[k][i|b[k]],dist);
if(mp[yx[k]][yy[k]]=='G'){f[k][i|b[k]]=lim;}
}
}
}
return ;
}
int main(){
int i,j;
while(scanf("%d%d",&n,&m) && n && m){
init();bct=yct=;
tar=;
for(i=;i<=n;i++)scanf("%s",mp[i]+);
for(i=;i<=n;i++)
for(j=;j<=m;j++){
if(mp[i][j]=='F'){yx[]=i,yy[]=j;}
else if(mp[i][j]=='Y'){yx[++yct]=i;yy[yct]=j;b[yct]=<<(++bct);tar|=b[yct];}
else if(mp[i][j]=='G'){yx[++yct]=i;yy[yct]=j;b[yct]=<<(++bct);}
}
b[]=;
/* for(i=0;i<=yct;i++){
printf("%d %d",yx[i],yy[i]);
printf(" type:%c\n",mp[yx[i]][yy[i]]);
printf("b:%d\n",b[i]);
}
printf("tat:%d\n",tar);*/
for(i=;i<=yct;i++)BFS(yx[i],yy[i]);
/* for(i=0;i<=yct;i++)
for(j=0;j<=yct;j++){
printf("(%d %d) to (%d %d):",yx[i],yy[i],yx[j],yy[j]);
printf("%d\n",dis[yx[i]][yy[i]][yx[j]][yy[j]]);
}
*/
int l=,r=n*m*,ans=1e8;
while(l<=r){
int mid=(l+r)>>;
if(solve(mid)){
ans=mid;
r=mid-;
}
else l=mid+;
}
if(ans<=n*m*)printf("%d\n",ans);
else printf("-1\n");
}
return ;
}
HDU3681 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 ...
- Prison Break
Prison Break 时间限制: 1 Sec 内存限制: 128 MB提交: 105 解决: 16[提交][状态][讨论版] 题目描述 Scofild又要策划一次越狱行动,和上次一样,他已经掌 ...
- hdu3511 Prison Break 圆的扫描线
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=3511 题目: Prison Break Time Limit: 10000/5000 MS ( ...
- 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]. 题目思路:利用最小费优先队列优化最短路 ...
随机推荐
- 02_Java基础_第2天(变量、运算符)_讲义
今日内容介绍 1.变量 2.运算符 01变量概述 * A: 什么是变量? * a: 变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器, * 例如水杯是容器,用来装载水:你家里的大衣柜 ...
- 201621123037 《Java程序设计》第7周学习总结
作业06-接口.内部类 1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 答: 思维导图: 其他-笔记: 2. 书面作业 1. ArrayList代码分析 1.1 解释Arr ...
- 从理论到实践,全方位认识DNS
从理论到实践,全方位认识DNS 2015-11-23 程序员之家 作者:selfboot 原文:http://segmentfault.com/a/1190000003956853 对于 DNS(Do ...
- BPSK相干解调和DBPSK非相干解调误码率仿真
BPSK相干解调和DBPSK非相干解调误码率仿真 本脚本完成了BPSK和DBPSK两种不同调制方式下的误码率(DBPSK差分相干)仿真, 并和理论曲线进行了对比. 撰写人:*** 最后修改日期:201 ...
- list的迭代器能解决并发问题,collection 的迭代器不能解决并发问题,for可以解决并发问题
list的迭代器能解决并发问题,collection 的迭代器不能解决并发问题 为什么list支持add,collection不支持 例如有两个人同时添加第三个元素 list的迭代器能锁定线程 只有等 ...
- QT样式表
QT样式表 一.QT样式表简介 1.QT样式表简介 QSS的主要功能是使界面的表现与界面的元素分离,使得设计皮肤与界面控件分离的软件成为可能. QT样式表是允许用户定制widgets组件外观的强大机制 ...
- 洛谷 P4585 [FJOI2015]火星商店问题 解题报告
P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...
- 【learning】中国剩余定理
问题描述 "今有物不知其数,三三数之余二,五五数之余三,七七数之余二.问物几何?" emmm这是..最开始这个问题被提出来的描述 其实说白了就是求解一次同余式组 然后还可以..解决 ...
- HTML+CSS鼠标悬停效果
HTML+CSS实现鼠标悬停效果 HTML: <link href="style.css" rel="stylesheet"> <a clas ...
- MATLAB2010安装方法
MATLAB2010安装方法 第一步选择无网络安装. 选择yes,然后点击next 激活序列号在crack文件夹中的txt文档中 这一步按照图片上的显示操作就可以 选择经典安装 按提示操作,这一步事激 ...