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. 每一步, 只能走某一个标号, 可以向四个方向走, 然后必须要碰到墙或者图的边界或者另一个标号才能停下来. ...
随机推荐
- MFC dfs遍历文件
//如果涉及到大文件的遍历(大于4GB),可以将以下代码_finddata_t换成__finddata64_t,_findfirst换成_findfirst64,_findnext换成_findnex ...
- cocos2dx实现经典飞机大战
游戏开始层 #ifndef __LayerGameStart_H__ #define __LayerGameStart_H__ #include "cocos2d.h" USING ...
- Linux系统如何查看CPU型号等
有时候在下载jdk或其它用图的时候,可能需要查看一下这个cpu的型号 [root@subvm ~]# less /proc/cpuinfo |grep modelmodel : 4 ...
- 《Effective Java》笔记 使类和成员的可访问性最小化
类和接口 第13条 使类和成员的可访问性最小化 1.设计良好的模块会隐藏所有的实现细节,把它的API与实现清晰的隔离开来,模块之间只通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况: ...
- 解决来QQ消息后歌曲音量降低问题
今天学了一天,晚上听歌放松一下,谁知碰到了一个很纠结的问题,我正在聊天,每当来QQ消息后,我的歌曲音量自动降低,降到非常小,然后我就调高 音量,把音乐的音量调到最大,又把系统音量调到最大,谁知音乐的声 ...
- win8 鼠标失灵解决办法
前几天 也没更新,却不知道突然win8 pro 失灵了,是不是ms 后台运行的也不确定,不过更新之后就可以用了. 经供参考: 更新前: 更新后: 我的主板是华硕的,有时候需要重启几次鼠标才显示出来
- (六)WebRTC手记之WebRtcVideoEngine2模块
转自:http://www.cnblogs.com/fangkm/p/4401143.html 终于讲到视频数据的编码发送模块了,不容易.总体来说也看了不少时间WebRTC的源码了,最大的感触就是各个 ...
- JSP页面中的pageEncoding和contentType两种属性
关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容 ...
- C# MarshalByRefObject 和Serializable的区别
这两种方式的类一般都是用于远程传输时使用. marshalbyrefobject是通过引用传递serializable是通过值传递,现在就来分析下什么是引用传递,什么是值传递. 理解这个对Remoti ...
- Jquery操作
一.文档操作 1.内部插入:append(),appendTo(),prepend(): 2.外部插入:after(),before(): 3.删除操作:remove(),empty(): 4.克隆操 ...