CQBZOJ 避开怪兽
题目描述
给出一个N行M列的地图,地图形成一个有N*M个格子的矩阵。地图中的空地用’.’表示。其中某些格子有怪兽,用’+’表示。某人要从起点格子’V’走到终点格子’J’,他可以向上、下、左、右四个方向行走。因此,起点和终点之间可以有许多条路径。注意:即使是有怪兽的格子,他也可以走上去。 设路径上某个格子的坐标为(R,C),某个怪兽的坐标为(A,B),那么它们之间的曼哈顿距离定义为:|R-A| + |C-B| 显然,地图上可能有许多怪兽,路径上也可能途经许多格子,每个格子到每个怪兽都可以算出之间的曼哈顿距离。 问整条路径中离怪兽的曼哈顿距离最小值最大为多少?
输入
输入格式: 第1行:2个整数N和M(1 ≤ N, M ≤ 500) 接下来N行,每行M个字符,可能是’.’, ‘+’, ‘V’, ‘J’等. 数据保证仅包含1个’V’ 和1个 ‘J’ ,至少有1个’+’
输出
输出格式: 第1行:1个整数,表示最短曼哈顿距离的最大值
样例输入
输入样例1:
4 4
+…
….
….
V..J
输入样例2
4 5
…..
.+++.
.+.+.
V+.J+
样例输出
输出样例一:
3
输出样例二:
0
一开始yy到了很多方法:
强行求出每个点到最近怪兽的曼哈顿距离,pass
BFS一波,pass
…………
左撞右撞,终于想到了一个正常的解法——二分答案
二分离怪兽的最短曼哈顿距离,将每个怪兽周围曼哈顿距离等于其的,标记一下,用BFS验证起点终点是否联通,来实现放缩
算了一下时间复杂度, O(n2log(2n)) O(n^2log(2n))
如果全屏怪兽,这种方法很危险,但没办法,数据好水哦,美滋滋~~~
代码如下:
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
struct node{int x,y;
}mst[250001];
int m,n;
int map[501][501];
int sx,sy,ex,ey,cnt;
int u[4]={-1,1,0,0},z[4]={0,0,-1,1};
void getmap()
{int i,j;char c[501];for(i=1;i<=m;i++){scanf("%s",c+1);for(j=1;j<=n;j++){if(c[j]=='V')sx=i,sy=j;if(c[j]=='J')ex=i,ey=j;if(c[j]=='+')mst[++cnt].x=i,mst[cnt].y=j;}}
}
void work(int mhd)
{for(int k=0;k<=mhd;k++)for(int i=1;i<=cnt;i++){if(mst[i].x+k>0&&mst[i].x+k<=m&&mst[i].y+(mhd-k)>0&&mst[i].y+(mhd-k)<=n)map[mst[i].x+k][mst[i].y+(mhd-k)]=1;if(mst[i].x-k>0&&mst[i].x-k<=m&&mst[i].y+(mhd-k)>0&&mst[i].y+(mhd-k)<=n)map[mst[i].x-k][mst[i].y+(mhd-k)]=1;if(mst[i].x+k>0&&mst[i].x+k<=m&&mst[i].y-(mhd-k)>0&&mst[i].y-(mhd-k)<=n)map[mst[i].x+k][mst[i].y-(mhd-k)]=1;if(mst[i].x-k>0&&mst[i].x-k<=m&&mst[i].y-(mhd-k)>0&&mst[i].y-(mhd-k)<=n)map[mst[i].x-k][mst[i].y-(mhd-k)]=1;}
}
bool bfs()
{queue<int>Q[2];Q[0].push(sx),Q[1].push(sy);while(!Q[0].empty()){int x=Q[0].front(),y=Q[1].front();Q[0].pop(),Q[1].pop();for(int i=0;i<4;i++)if(x+u[i]>0&&x+u[i]<=m&&y+z[i]>0&&y+z[i]<=n&&!map[x+u[i]][y+z[i]]){if(x+u[i]==ex&&y+z[i]==ey)return 1;map[x+u[i]][y+z[i]]=1;Q[0].push(x+u[i]),Q[1].push(y+z[i]);}}return 0;
}
int main()
{int l=0,r=1<<30,mid;scanf("%d%d",&m,&n);getmap();for(int i=1;i<=cnt;i++)r=min(min(abs(sx-mst[i].x)+abs(sy-mst[i].y),abs(ex-mst[i].x)+abs(ey-mst[i].y)),r);while(l<r){memset(map,0,sizeof map);mid=(l+r)>>1;work(mid);if(bfs())l=mid+1;else r=mid;}printf("%d",l);
}
CQBZOJ 避开怪兽相关推荐
- 共享充电宝“脱贫”:打脸王思聪 眼红了“负翁”ofo
2017年5月4日,当为自己代言的陈欧宣布街电获得聚美优品3个亿的融资后,"娱乐圈纪委"王思聪在朋友圈讽刺称,"共享充电宝要是能成我吃翔,立帖为证."两年半的时 ...
- 一名普通cs本科生的自述—【大学到底怎么过才值?】
0.总结 Get to the points first. The article comes from LawsonAbs! 选择比努力重要 IT行业更看重能力 运气往往比实力更有决定因素 人虽是成 ...
- java越野车架_越野怪兽 JAVA摆渡人 (ANIMA)山地车
原标题:越野怪兽 JAVA摆渡人 (ANIMA)山地车 JAVA作为近几年迅速崛起的国产品牌,推出的一系列产品中带着鲜明的"JAVA"风格,无论是费罗切还是火山.鱼雷等车型都极具辨 ...
- 生活风水系列(更避邪常识)之一
客厅风水十大禁忌-----供各位参考 客厅风水是阳宅风水中最重要的一环. 一个家庭整体宅运的吉凶,无论是事业升迁的顺逆.运数的高低.家人财运的好坏.夫妻缘份的深浅.子女读书.考试的运.健康状况是否正常 ...
- java费罗切坐管夹_越野怪兽 JAVA摆渡人 (ANIMA)山地车
JAVA作为近几年迅速崛起的国产品牌,推出的一系列产品中带着鲜明的"JAVA"风格,无论是费罗切还是火山.鱼雷等车型都极具辨识度.在定位清晰的产品战略下,JAVA一路高歌猛进.下面 ...
- 距离传感器控制灯泡代码_如何使用颜色传感器和超声波传感器检测障碍物和避障...
上一期的内容中,我给大家介绍了如何使用触碰传感器检测障碍物和避障,今天我们再来说说如何使用颜色传感器和超声波传感器检测障碍物和避障. 使用颜色传感器 在大多数情况下,EV3颜色传感器并不适合用于障碍物 ...
- 已知环境静态障碍物避障_我女儿如何教我无障碍环境
已知环境静态障碍物避障 by Drew 通过德鲁 我女儿如何教我无障碍环境 (How my daughter taught me about accessibility) 在过去的几个月里,花了很多时 ...
- 发布 128 核 Altra Max,自研内核,明年推出 5nm 处理器,“性能怪兽”Ampere 搞大事?...
作者 | 伍杏玲 出品 | AI 科技大本营(ID:rgznai100) 头图 | 下载于ICphoto 2015 年,在英特尔就职 28 年的总裁 Renee James 辞职,正在大众纷纷猜测她将 ...
- 求助:我有一辆机器人小车,怎么让它跑起来,还会避障、目标跟踪、路径规划?...
也许,你曾见过 能灵活地绕开障碍物的它 在桌子边缘"疯狂试探"的它 它是谁? 没错,它就是是英伟达推出的一款入门级人工智能小车--Jetbot ,估计对机器人,尤其是对车械感兴趣的 ...
最新文章
- Spring学习4之依赖注入(DI)
- c++函数模板和类模板
- C++基础-内存管理
- 微信群「斗图」总输,Python助我超神!
- linux 远程调试
- Java基础学习总结(81)——如何尽可能的减少Java代码中bug
- ImageView的属性android:scaleType
- html图片垂直边距,html – 为什么水平边距不会像垂直边距那样崩溃?
- spring系统学习:day4--Spring工厂
- Spring - 基于JPA的动态SQL执行器
- 市民云注销账号实名认证还有吗_这可能是全网最详细的注销网易服务的教程了...
- 2000级2班同学聚会邀请函.doc
- unity3d 词典访问_正确的词典访问方式
- PageHelper.startPage的作用
- LeetCode1-580题汇总
- WIN2000故障修复之故障恢复控制台篇
- 沐风微信营销水库模型二:建设专属秘密武器库!
- MATLAB 数学应用 微分方程 常微分方程 求解非刚性ODE
- Django 搜索结果分页的实现 以及点击下一页搜索条件丢失可能的原因分析
- (转)一致性哈希算法原理