题目描述

给出一个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))

如果全屏怪兽,这种方法很危险,但没办法,数据好水哦,美滋滋~~~

代码如下:

#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 避开怪兽的更多相关文章

  1. [SinGuLaRiTy] 图论题目复习

    [SInGuLaRiTy-1027] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [Vijos 1423] 最佳路线 题目描述 年久失修的 ...

  2. Objective-C中小怪兽的逻辑

    学习Objective-C的面向对象也有一段时间了,为了犒劳自己的学习成果,写个小怪兽来犒劳一下自己把.在LOL中有怪兽和英雄的角色吧,接下来就先写一个小怪兽的类吧.从小怪兽的角度来讲,怪兽都有那些行 ...

  3. “奥特曼攻打小怪兽”java学习打怪升级第一步

    ---恢复内容开始--- 练习:回合制对战游戏:奥特曼和小怪兽进行PK,直到一方的血量为0时结束战斗,输出谁胜利了! 不难看出场景中有两个对象:”奥特曼“这一对象抽象为”Ao"类:     ...

  4. Bug避障算法简介

    移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.避障是指移动机器人根据采集的障碍物的状态信息,在行走过程中通过传感器感知到妨碍其通行的静态和动态物体时,按照一定的方 ...

  5. Hunt the Wumpus第二个版本---多怪兽,多洞穴,洞穴间双向互通

    其中,将洞穴连起来的算法要好好体会. 学习构建临时变量列表,确认循环用FOR,非确定循环用 WHILE,并定好退出条件. from random import choice cave_numbers ...

  6. 怪兽z主机豪华版 答问。

    我的淘宝店里,怪兽z主机标准版,分经济版本,标准版,豪华版,三个版本.这里给大家详细介绍一下豪华版的概况. 淘宝购买地址:http://item.taobao.com/item.htm?id=3818 ...

  7. 饼干怪兽和APT攻击

    APT攻击就像一个孩子,你通过各种方式窃取他们的大脑要拿出饼干,为了防止恶意攻击,过失作为母亲未能发现和防止饼干盗窃贼如.于她仅仅监视厨房椅子.衣柜门或烤箱门的开启.建立起有效防御目标攻击与APT攻击 ...

  8. 机器人局部避障的动态窗口法(dynamic window approach) (转)

    源:机器人局部避障的动态窗口法(dynamic window approach) 首先在V_m∩V_d的范围内采样速度: allowable_v = generateWindow(robotV, ro ...

  9. [TPYBoard - Micropython 之会python就能做硬件 9] 五分种学会用TPYBoard V102 制作避障小车(升级版)

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 感谢山东萝卜电子科技公司授权   一.实验器材 1.TPYboard V102板 ...

随机推荐

  1. 2018-8-10-C#-6.0-字符串-String-Interpolation

    title author date CreateTime categories C# 6.0 字符串 String Interpolation lindexi 2018-08-10 19:16:52 ...

  2. springmvc整合freemarker教程(转)

    1.介绍 我最近喜欢freemarker在网上找了大半天.都没有找到一个简单又容易理解的案例.虽然只是一个模板技术.但是相对刚开始什么都不知道的,很难入手.下面是自学(其实是谷歌和百度的东找西补).写 ...

  3. Perl中的bless的理解

    bless有两个参数:对象的引用.类的名称. 类的名称是一个字符串,代表了类的类型信息,这是理解bless的关键. 所谓bless就是把 类型信息 赋予 实例变量. [xywang@mnsdev13: ...

  4. springboot-集成WebSockets广播消息

    一 WebScoketS 简介 RFC 6455 即 webSockets 协议提供了一种标准化的方式去建立全双工,双方面交流的通道在客户端和服务端甚至单一的TCP连接中进行通信: webSocket ...

  5. tomcat启动慢问题

    sed -i 's/securerandom\.source\=file\:\/dev\/random/securerandom\.source\=file\:\/dev\/urandom/g' $J ...

  6. Kerrigan:配置中心管理UI的实现思路和技术细节

    去年写过一篇文章『中小团队落地配置中心详解』,介绍了我们借助etcd+confd实现的配置中心方案,这是一个对运维友好,与开发解耦的极佳方案,经过了一年多的实践也确实帮我们解决了配置文件无版本.难回滚 ...

  7. linux权限说明

    Linux 中的权限 这里我拿一个tomcat目录举例说明.首先我们在linux系统中执行命令:ls -l 我们拿出其中一个说明-rwxr-xr-x,在Linux 系统中权限是区分用户的,即用户.组用 ...

  8. 《深入理解JAVA虚拟机》-自己动手编译JDK

    环境 Ubuntu12.4-http://mirrors.163.com/ubuntu-releases/12.04/ --需要安装纯英文版,避免中文引起不必要的麻烦 OpenJDK7-https:/ ...

  9. python利用scapy嗅探流量

    能实时监测流量, 只显示有问题的流量, 可疑流量要显示出在那个数据包里 所有流量都保存到为pcap 每5000个包保存一个 第3个自动下载到本地       def sniff(count=0, st ...

  10. SSM三大框架整合思路

    1.Dao层: Mybatis的配置文件:SqlMapConfig.xml 不需要配置任何内容,需要有文件头.文件必须存在. applicationContext-dao.xml: mybatis整合 ...