区域判断hdu 3681 Prison Break bfs+二分+dp
时间紧张,先记一笔,后续优化与完善。
这个是2010杭州区域赛的目题。
bfs出最短路,二分谜底,dp判断可行性。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=17,maxm=300;
int n,m,lon,ret;
char a[maxn][maxn];
int b[maxn],d[maxn][maxn];
int quex[maxm],quey[maxm],text[maxn][maxn],f[maxn][maxn];
int dp[1<<17][20];
int work(int ans)
{
memset(dp,1,sizeof(dp));
for(int i=0;i<lon;i++)
if(d[16][i+1]<=ans)
{
dp[1<<i][i+1]=d[16][i+1];
if(b[i+1]==1)
dp[1<<i][i+1]=0;
}
for(int k=0;k<(1<<lon);k++)
for(int i=0;i<lon;i++)
for(int j=0;j<lon;j++)
if(dp[k][i+1]+d[i+1][j+1]<=ans)
{
dp[k|(1<<j)][j+1]=min(dp[k|(1<<j)][j+1],dp[k][i+1]+d[i+1][j+1]);
if(b[j+1]==1)
if((k&(1<<j))==0)
dp[k|(1<<j)][j+1]=0;
}
for(int k=0;k<(1<<lon);k++)
if((k&((1<<ret)-1))==(1<<ret)-1)
for(int i=1;i<=lon;i++)
if(dp[k][i]<=ans)
return(1);
return(0);
}
void bfs(int t,int s)
{
memset(text,0,sizeof(text));
memset(f,1,sizeof(f));
f[t][s]=0;
text[t][s]=1;
int front=1,end=0;
quex[++end]=t;
quey[end]=s;
int u=a[t][s];
d[u][u]=0;
while(front<=end)
{
int x=quex[front],y=quey[front++];
if(a[x][y]=='D') continue;
int v=a[x][y];
if(v>=1&&v<=16)
{
d[u][v]=f[x][y];
d[v][u]=f[x][y];
}
if(x>1)
{
if(f[x-1][y]>f[x][y]+1)
{
f[x-1][y]=f[x][y]+1;
if(!text[x-1][y])
{
quex[++end]=x-1;
quey[end]=y;
}
}
}
if(x<n)
{
if(f[x+1][y]>f[x][y]+1)
喜欢海,不管湛蓝或是光灿,不管平静或是波涛汹涌,那起伏荡漾的,那丝丝的波动;喜欢听海的声音,不管是浪击礁石,或是浪涛翻滚,那轻柔的,那澎湃的;喜欢看海,不管心情是舒畅的或是沉闷的,不管天气是晴朗的或是阴沉的,那舒心的,那松弛的……
{
f[x+1][y]=f[x][y]+1;
if(!text[x+1][y])
{
quex[++end]=x+1;
quey[end]=y;
}
}
}
if(y>1)
{
if(f[x][y-1]>f[x][y]+1)
{
f[x][y-1]=f[x][y]+1;
if(!text[x][y-1])
{
quex[++end]=x;
quey[end]=y-1;
}
}
}
if(y<m)
{
if(f[x][y+1]>f[x][y]+1)
{
f[x][y+1]=f[x][y]+1;
if(!text[x][y+1])
{
quex[++end]=x;
quey[end]=y+1;
}
}
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
while(scanf("%d %d",&n,&m),n||m)
{
lon=0;
for(int i=1;i<=n;i++)
scanf("%s",&a[i][1]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]=='Y')
{
a[i][j]=++lon;
b[lon]=2;
}
else if(a[i][j]=='F')
{
a[i][j]=16;
}
ret=lon;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]=='G')
{
a[i][j]=++lon;
b[lon]=1;
}
memset(d,1,sizeof(d));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]>=1&&a[i][j]<=16)
bfs(i,j);
int ture=0;
for(int i=1;i<=ret;i++)
if(d[16][i]>300)
ture=1;
if(ret==0)
{
printf("0\n");
continue;
}
if(ture)
{
printf("-1\n");
continue;
}
int st=0,ed=1000,mid;
while(st<ed)
{
int mid=(st+ed)>>1;
if(work(mid))
ed=mid;
else
st=mid+1;
}
printf("%d\n",st);
}
return 0;
}
文章结束给大家分享下程序员的一些笑话语录: 自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。
转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/04/28/3049921.html
区域判断hdu 3681 Prison Break bfs+二分+dp相关推荐
- HDU - 3681 Prison Break(状态压缩 + 最短路)
题目大意:有一个机器人想越狱,越狱的要求是将所有的电网开关关掉.现在给出一个地图,'S'表示空地,'F'表示起始地点,'G'表示充电池,'D'表示禁地,'Y'开关 充电池可以将机器人的电充满.机器人每 ...
- HDU - 1495 非常可乐(BFS,数学)
HDU - 1495 非常可乐(BFS,数学) 巨佬的数学解法 #include<iostream> using namespace std; int gcd(int a,int b) { ...
- 蒟蒻的第一篇博客CF1041C Coffee Break(二分+贪心+set)
CF1041C Coffee Break(二分+贪心+set) 描述 Recently Monocarp got a job. His working day lasts exactly mm min ...
- zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
zxing qr区域判断 在本文中,我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像. QR码生成 下面的代码使用Zxing库创建一个表示QR ...
- Prison Break中的经典台词
前一段看prison break 看得很火,摘抄了四段经典台词再加上我的感受,感觉通过美剧学习英语是很好的渠道. No. 1 Michael/Doctor: You and me-It's real- ...
- 百度地图 点maker在区域判断(圆Circle,多边形polygon,矩形rectangle,线line上)
百度地图 秘钥申请(AK) 代码 <!DOCTYPE html> <html lang="en"> <head><meta charset ...
- 电视剧《Prison Break(越狱)》真的很不错,多少年没有这么经典的节目了,风靡全球啊。。。...
片名:<Prison Break>译名:<越狱>地区:美国 类型:剧情类连续剧片长:从2005年8月29日起播出 出品:福克斯(Fox)导演:桑福德-布克斯塔弗.博比-罗斯.布 ...
- 【bzoj1044】[HAOI2008]木棍分割 二分+dp
题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...
- HDU 1520 Anniversary party(树形dp)
HDU 1520 Anniversary party(树形dp) 树形dp第一题!!! 题意很清晰,思路也很明确.很容易找到根节点,即最大的boss,通过根节点向下dp. 状态转移方程: int to ...
最新文章
- flask urllib上传图片
- 3DSlicer7:FAQ-1
- linux的各种版本,各种版本Linux系统下载
- 能上架App的GooglePlay开发者账号获取流程
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )(转自IT博客)
- 模型如何京东培训6万人
- python中for循环和while循环else语句的执行过程和陷阱
- Python打包成exe,pyc
- lstm中look_back的大小选择_[Pytorch和Tensorflow对比(二)]:LSTM
- Android.mk调用bin/shell
- 用python来部署远程程序
- win7下matable7运行停止工作
- Javascript培训PPT
- pcnn关系抽取论文阅读总结:尽量细节表现出来
- java随机生成6位流水号,Java生成随机流水号
- 【联想小新笔记】win10查看本机wifi无线网络密码
- STM32F103_study59_The punctual atoms(Input capture experimentInput to capture experimental theoreti)
- 淘宝客网站应该怎么优化?
- 苹果内置录屏SDK-ReplayKit库的使用说明
- MATLAB实现变限积分函数的积分/ 多重积分/ 如何解决求积分显示AB浮点标量报错
热门文章
- tcpip数据包编码解析(chunk and gzip)_space of Jialy_百度空间
- Tuxedo 介绍与安装(一)
- Qt:QListWidget的item上实现右键菜单
- [Java] 1006. Sign In and Sign Out (25)-PAT甲级
- L1-006. 连续因子-PAT团体程序设计天梯赛
- 历史数据清理--方案
- JDBC 与 JNDI 这两种连接方式 区别
- Android进阶: 10分钟实现NDK-JNI 开发教程
- centos 7.3 设置静态IP
- 【EASYDOM系列教程】之属性操作