UVALive 7297 bfs
题意 一个小偷偷到了项链 他想知道自己是否可以逃出去 地图中有一个小偷 一个警察 警察有一条狗 一开始 小偷和警察的移动速度都是1 当警察走到小偷经过过的地方时 警察会有一条狗嗅到小偷的气味并且以2的速度去追
由于问题问的是 小偷是否必定有方法逃出 所以我们可以看作 有无限个警察从一个点出发去抓小偷 每经过一个点 这个点上就会有一个警察站着
所以会有一个limit来记录警察到达这个点的最短的时间 我们可以想到 小偷到这个点的时间和警察到达这个点的时间的差 就是小偷到这个点之后可以行动的时间(如果他以正确的方式移动 他将会在这个时间之后被之后到达这个点的警察的狗以速度2抓到)
所以 我使用t记录小偷从一开始进行的移动时间 lim记录小偷被追到的时间
可以看出 小偷每到一个点 他都会面对一个会在之后的某个时间正常速度走到这个点的警察 这个警察会在之后的某个时间抓到他 而这个时候 小偷背后还有很多个警察 他们也会在某个时间抓到小偷 所以每到一个点 就把到这个点的警察与小偷背后的最快的警察 两个人追到小偷的时间做对比 保留最快的警察
需要注意的是由于这个图是50*50的(然而即使开一个60*60的数组也并不能通过 需要更大) 所以 如果我们不对状态进行限制(加上类似于vis数组的东西) 会超时 并且涛哥提示我 这个点的lim是由小偷到这个点的t和limit[x][y]共同决定的 所以无论这个vis数组记录的是当前时间还是小偷被抓到的时间亦或是小偷可以移动的时间 都是可以的
本来是用j数组来记录最小时间控制这个点的状态压入的 但是只用小偷到达这个点的是与否记录的话 也是可以通过的 我认为是 在普通的移动bfs里面 由于小偷是没有其他状态的 所以 先到的 更好
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
#include<iostream>
using namespace std;
int n , m;
int limit[550][550];
char mp[600][600];
int j[550][550];
struct node
{
int t;
int x,y;
int lim;
};
int stx,sty;
int px,py;
int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};
bool check(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m)
{
if(mp[x][y]!='X')
{
return true;
}
}
return false;
}
void bfs1()
{
node f;
f.t=0;
memset(limit,-1,sizeof(limit));
f.x=px;
f.y=py;
queue<node >q;
q.push(f);
limit[f.x][f.y]=0;
while(!q.empty())
{
f=q.front();
q.pop();
for(int i =0; i<4; i++)
{
node s= f;
s.x+=dx[i];
s.y+=dy[i];
s.t++;
if(check(s.x,s.y)&&(limit[s.x][s.y]==-1||limit[s.x][s.y]>s.t))
{
limit[s.x][s.y]=s.t;
q.push(s);
}
}
}
}
bool bfs2()
{
queue<node >q;
node f;
f.x=stx;
f.y=sty;
f.t=0;
f.lim=limit[f.x][f.y]*2;
memset(j,-1,sizeof(j));
q.push(f);
while(!q.empty())
{
f=q.front();
q.pop();
if(mp[f.x][f.y]=='E')
{
return true;
}
for(int i=0; i<4; i++)
{
node s= f;
s.x+=dx[i];
s.y+=dy[i];
s.t++;
if(check(s.x,s.y))
{
if(s.t<limit[s.x][s.y])
{
if(s.t<s.lim)
{
if(j[s.x][s.y]==-1||j[s.x][s.y]>s.lim)
{
j[s.x][s.y]=s.lim;
int nexlim=limit[s.x][s.y]*2-s.t;
s.lim=min(s.lim,nexlim);
q.push(s);
}
}
}
}
}
}
return false;
}
int main()
{
while(cin>>m>>n)
{
if(m==0&&n==0)
break;
getchar();
for(int i = 1; i<= n; i++)
{
gets(mp[i]+1);
}
for(int i = 1; i<= n; i++)
{
for(int k = 1; k<= m; k++)
{
if(mp[i][k]=='T')
{
stx=i;
sty=k;
}
if(mp[i][k]=='K')
{
px=i;
py=k;
}
}
}
bfs1();
if(bfs2())
{
printf("KEEP IT\n");
}
else
{
printf("DROP IT\n");
}
}
}
UVALive 7297 bfs的更多相关文章
- UVALive 7297 Hounded by Indecision BFS
题目链接:Hounded by Indecision 题意:map中给出小偷的位置,警察的位置.警察有一只狗,开始的时候警察和狗一起行动,也就是看做一个格子,当警察遇见小偷走过的格子时,狗就会嗅到它的 ...
- UVALive 3977 BFS染色
这个题意搞了半天才搞明白 就是如果定义一个d-summit,即从该点到另一个更高的点,经过的路径必定是比当前点低至少d高度的,如果该点是最高点,没有比他更高的,就直接视为顶点 其实就是个BFS染色,先 ...
- What a Ridiculous Election UVALive - 7672 (BFS)
题目链接: E - What a Ridiculous Election UVALive - 7672 题目大意: 12345 可以经过若干次操作转换为其它五位数. 操作分三种,分别为: 操作1:交 ...
- UVALive 5066 Fire Drill BFS+背包
H - Fire Drill Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Sta ...
- UVALive 4025 Color Squares(BFS)
题目链接:UVALive 4025 Color Squares 按题意要求放带有颜色的块,求达到w分的最少步数. //yy:哇,看别人存下整个棋盘的状态来做,我什么都不想说了,不知道下午自己写了些什么 ...
- UVALive 5066 Fire Drill --BFS+DP
题意:有一个三维的地图,有n个人被困住,现在消防队员只能从1楼的一个入口进入,营救被困者,每一个被困者有一个价值,当消防队员找到一个被困者之后,他可以营救或者见死不救,如果救的话,他必须马上将其背到入 ...
- UVALive 6665 Dragonâs Cruller --BFS,类八数码问题
题意大概就是八数码问题,只不过把空格的移动方式改变了:空格能够向前或向后移动一格或三格(循环的). 分析:其实跟八数码问题差不多,用康托展开记录状态,bfs即可. 代码: #include <i ...
- UVALive 3956 Key Task (bfs+状态压缩)
Key Task 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/D Description The Czech Technica ...
- uvalive 6888 Ricochet Robots bfs
题目链接 给一个n*m的图, 图上有n个标号, n<=4, 然后有墙, 还有一个终点x. 每一步, 只能走某一个标号, 可以向四个方向走, 然后必须要碰到墙或者图的边界或者另一个标号才能停下来. ...
随机推荐
- mysql 建表语句
修改id为自动增长: alter table book b_ISBN int(11) auto_increment; 自动增长要加的:auto_increment 基本的sql语句: 选择:sel ...
- Fresco 源码分析(一) DraweeView-DraweeHierarchy-DraweeController(MVC) DraweeHierachy+DraweeController的分析
4.1.5.2 模型层DraweeHierachy继承体系以及各个类的作用 DraweeHierachy (I) --| SettableDraweeHierarchy (I) ------| Gen ...
- 使yum保留下载的rpm包
[root@14LN yum]# egrep 'cachedir|keepcache' /etc/yum.conf #cachedir=/var/cache/yum/$basearch/$releas ...
- java基础知识回顾之javaIO类总结
java IO体系图 IO流的操作规律总结: 1,明确体系: 数据源:InputStream ,Reader 数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符. ...
- JUC回顾之-ScheduledThreadPoolExecutor底层实现原理和应用
项目中经常使用定时器,比如每隔一段时间清理下线过期的F码,或者应用timer定期查询MQ在数据库的配置,根据不同version实现配置的实时更新等等.但是timer是存在一些缺陷的,因为Timer在执 ...
- JS输入框邮箱自动提示(带有demo和源码)(转载)
今天在javascriptQQ群里面 有童鞋问到 有没有 "JS输入框邮箱自动提示"插件,即说都找遍了github上源码 都没有看到这样类似的插件,然后我想了下 "JS输 ...
- [原]AppPoolService-IIS应用程序池辅助类(C#控制应用程序池操作)
using System.Collections.Generic; using System.DirectoryServices; using System.Linq; using Microsoft ...
- Struts2文件上传和下载(原理)
转自:http://zhou568xiao.iteye.com/blog/220732 1. 文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1) ...
- JVM的堆分配
为了展示虚拟机如何使用方法区中的信息,下面来举例说明: class Lava { private int speed = 5; void flow(){ } } public class ...
- BZOJ3547 : [ONTAK2010]Matchings
树形DP f[i][0]表示不向下连边的最大匹配数 f[i][1]表示向下连一条边的最大匹配数 h[][]表示对应的方案数 为了防止爆栈用BFS 为了防止MLE: 1.数组循环利用,比如存边的数组在存 ...