时间紧张,先记一笔,后续优化与完善。

这个是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相关推荐

  1. HDU - 3681 Prison Break(状态压缩 + 最短路)

    题目大意:有一个机器人想越狱,越狱的要求是将所有的电网开关关掉.现在给出一个地图,'S'表示空地,'F'表示起始地点,'G'表示充电池,'D'表示禁地,'Y'开关 充电池可以将机器人的电充满.机器人每 ...

  2. HDU - 1495 非常可乐(BFS,数学)

    HDU - 1495 非常可乐(BFS,数学) 巨佬的数学解法 #include<iostream> using namespace std; int gcd(int a,int b) { ...

  3. 蒟蒻的第一篇博客CF1041C Coffee Break(二分+贪心+set)

    CF1041C Coffee Break(二分+贪心+set) 描述 Recently Monocarp got a job. His working day lasts exactly mm min ...

  4. zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?

    zxing qr区域判断 在本文中,我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像. QR码生成 下面的代码使用Zxing库创建一个表示QR ...

  5. Prison Break中的经典台词

    前一段看prison break 看得很火,摘抄了四段经典台词再加上我的感受,感觉通过美剧学习英语是很好的渠道. No. 1 Michael/Doctor: You and me-It's real- ...

  6. 百度地图 点maker在区域判断(圆Circle,多边形polygon,矩形rectangle,线line上)

    百度地图 秘钥申请(AK) 代码 <!DOCTYPE html> <html lang="en"> <head><meta charset ...

  7. 电视剧《Prison Break(越狱)》真的很不错,多少年没有这么经典的节目了,风靡全球啊。。。...

    片名:<Prison Break>译名:<越狱>地区:美国 类型:剧情类连续剧片长:从2005年8月29日起播出 出品:福克斯(Fox)导演:桑福德-布克斯塔弗.博比-罗斯.布 ...

  8. 【bzoj1044】[HAOI2008]木棍分割 二分+dp

    题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...

  9. HDU 1520 Anniversary party(树形dp)

    HDU 1520 Anniversary party(树形dp) 树形dp第一题!!! 题意很清晰,思路也很明确.很容易找到根节点,即最大的boss,通过根节点向下dp. 状态转移方程: int to ...

最新文章

  1. flask urllib上传图片
  2. 3DSlicer7:FAQ-1
  3. linux的各种版本,各种版本Linux系统下载
  4. 能上架App的GooglePlay开发者账号获取流程
  5. __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )(转自IT博客)
  6. 模型如何京东培训6万人
  7. python中for循环和while循环else语句的执行过程和陷阱
  8. Python打包成exe,pyc
  9. lstm中look_back的大小选择_[Pytorch和Tensorflow对比(二)]:LSTM
  10. Android.mk调用bin/shell
  11. 用python来部署远程程序
  12. win7下matable7运行停止工作
  13. Javascript培训PPT
  14. pcnn关系抽取论文阅读总结:尽量细节表现出来
  15. java随机生成6位流水号,Java生成随机流水号
  16. 【联想小新笔记】win10查看本机wifi无线网络密码
  17. STM32F103_study59_The punctual atoms(Input capture experimentInput to capture experimental theoreti)
  18. 淘宝客网站应该怎么优化?
  19. 苹果内置录屏SDK-ReplayKit库的使用说明
  20. MATLAB实现变限积分函数的积分/ 多重积分/ 如何解决求积分显示AB浮点标量报错

热门文章

  1. tcpip数据包编码解析(chunk and gzip)_space of Jialy_百度空间
  2. Tuxedo 介绍与安装(一)
  3. Qt:QListWidget的item上实现右键菜单
  4. [Java] 1006. Sign In and Sign Out (25)-PAT甲级
  5. L1-006. 连续因子-PAT团体程序设计天梯赛
  6. 历史数据清理--方案
  7. JDBC 与 JNDI 这两种连接方式 区别
  8. Android进阶: 10分钟实现NDK-JNI 开发教程
  9. centos 7.3 设置静态IP
  10. 【EASYDOM系列教程】之属性操作