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]. 题目思路:利用最小费优先队列优化最短路 ...
随机推荐
- (三)MySQL终极篇
1.索引 详细介绍:http://www.cnblogs.com/57rongjielong/p/8039452.html 索引是对数据库表中一个或多个列的值进行排序的结构.索引是经过某种算法优化过的 ...
- week1词频统计
使用java完成对txt格式的英文短片进行字符提取及统计. package nenu.softWareProject; import java.io.*;import java.util.*; pub ...
- WOL*LAN远程换醒命令行方法
wol远程唤醒需要网卡的支持,现在一般的网卡也都支持,只有有线网络能实现. 这里介绍Wake On Lan Command Line的使用 下载地址 https://www.depicus.com/w ...
- adb使用过程常见的几种错误总结
问题1:Failure [INSTALL_FAILED_ALREADY_EXISTS] 问题原因:该程序已存在. 解决方法:增加-r参数,即可成功覆盖安装 问题2:Failure [INSTALL_F ...
- 【移动端debug-1】css3中box-shadow的溢出问题
今天做项目遇到一个box-shadow的溢出父容器的问题,如下面的代码中,子容器inner的box-shadow在没有任何设置的情况下是溢出父容器的. 代码: <!DOCTYPE html> ...
- CF464C-Substitutes in Number
题意 开始给出一个长为\(n\)的数字串,有\(m\)次操作按顺序执行,每次把当前数字串中的某一个数码替换成一个数字串\(t\)(可以为空或多位),最后问操作结束后的数字串十进制下模\(10^9+7\ ...
- BZOJ3745 COCI2015Norma(分治)
完全想不到地,考虑分治. 对区间[l,r],将左端点x由mid不断左移,右边记录最右的p满足max[mid+1,p]<=max[x,mid],q满足min[mid+1,q]>=min[x, ...
- 管理与技术未必不可兼得,一个20年IT老兵的码农生涯
作者|康德胜 我是一个喜欢写代码但几乎不太有机会写代码的CTO,也是一个看得懂财务报表.通过所有CFA(金融特许分析师)考试并获得FRM(金融风险经理)认证的拿到金融MBA的CTO,如果我有幸被称作码 ...
- 3.3 无连接运输:UDP
3.3 无连接运输:UDP 简介: UDP提供不可靠的服务,它只做了运输层能做的最少工作,除了分解/复用以及少量的差错检测之外,几乎对IP没增加什么东西. 为什么应用开发人员宁愿再UDP之上构建应用, ...
- 【bzoj2402】陶陶的难题II
Portal -->bzoj2402 Solution 这题的话,看到答案的形式想到分数规划(Portal -->[learning]) 套路一波,记当前二分的\(mid\)为\(\lam ...