Escape

 Descriptions:

一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y
问这个人能不能安全到达终点
要求: 
1.人不能到达炮塔所在的坐标
2.炮塔会挡住子弹
3.途中遇到子弹是安全的,但是人如果停在这个坐标,而子弹也刚好到这个坐标,人就被射死
4.人可以选择停止不动

Input

对于每个测试用例,第一行有四个整数,m、n、k和d (2<=m, n<=100, 0<=k<=100, m+ n<=d<=1000)。m和n是战场的大小,k是城堡的数量,d是A最初拥有的能量单位。接下来的k行分别描述了这些城堡。每一行包含一个字符c和四个整数,t, v, x和y。c是“N”,“S”,“E”或“W”给城堡的发射方向,t, v是子弹的速度(即单位通过每秒),和(x, y)是城堡的位置。这里我们假设,如果一座城堡被其他城堡击中,它会挡住其他人的射击,但不会被摧毁。两颗子弹会在不影响它们的方向和速度的情况下擦肩而过。

当小A开始逃跑时,所有的城堡都开始射击。

继续到文件末尾。


Output

如果小A能逃跑,在一行中输入其所需的最小秒数。否则,在一行中输出"Bad luck!"(无需带引号)


Sample Input

4 4 3 10
N 1 1 1 1
W 1 1 3 2
W 2 1 2 4
4 4 3 10
N 1 1 1 1
W 1 1 3 2
W 1 1 2 4

Sample Output

9
Bad luck!

题目链接

https://vjudge.net/problem/HDU-3533

其实不难,我们只需要看当人位于某个点的时候,其四个方向是否有炮塔,这个炮塔是都向人的方向射击,然后再看子弹是否刚好位于这个坐标即可。
而标记的话,vis[x][y][time],对于time时刻,人位于x,y的情况只需要访问一次,这是唯一的
 
AC代码
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 105
using namespace std;
int n,m,k,life;
int dt[][] = {,,,,,-,-,,,};//四个方向与停止不动的走法
int map[][];
bool vis[][][]; struct period
{
char c;
int t,v;
} s[][]; struct node
{
int x,y,step;
}; int check(int x,int y)
{
if(x< || x>n || y< || y>m)
return ;
return ;
} void bfs()
{
node now,net;
queue<node> q;
int i,j,flag,dis,timee;
now.x = now.y = now.step = ;
q.push(now);
vis[][][] = true;
while(!q.empty())
{
now = q.front();
q.pop();
if(now.step>life)
break;
if(now.x == n && now.y == m)
{
cout<<now.step<<endl;
return ;
}
for(i = ; i<; i++)
{
net = now;
net.x+=dt[i][];
net.y+=dt[i][];
net.step++;
if(check(net.x,net.y))
continue;
if(!s[net.x][net.y].t && !vis[net.x][net.y][net.step] && net.step<=life)//在符合条件的情况下,枚举四个方向
{
flag = ;
for(j = net.x-; j>=; j--)//当位于这点,我们往北向寻找是否有朝南方向射击的炮台
{
if(s[j][net.y].t && s[j][net.y].c == 'S')//找到第一个炮台,且这个炮台是朝南射击的
{
dis = net.x-j;//看炮台与人的距离
if(dis%s[j][net.y].v)
break;//因为不需要看子弹中途的点,子弹每一秒跑v,距离是dis,dis不能整除v的话,那么子弹是不可能停在这个点的
timee = net.step-dis/s[j][net.y].v;//人走的时间减去第一个子弹飞行到这个位置所需的时间
if(timee<)
break;//为负数就是第一个子弹都没有经过这个点,那么人绝对安全
if(timee%s[j][net.y].t==)//看间隔,能整除,那么就是后续有子弹刚好到这个点,人死定了
{
flag = ;
break;
}
}
if(s[j][net.y].t)//找到炮台但不是朝南射击,那么这个炮台会当下后面所有子弹,所以北方向安全我们不需要再找
break;
}
if(!flag)//这个方向都死定了,后面也就不需要看了
continue;
//其他方向也是一样的道理,就不注释了
for(j = net.x+; j<=n; j++)
{
if(s[j][net.y].t && s[j][net.y].c == 'N')
{
dis = j-net.x;
if(dis%s[j][net.y].v)
break;
timee = net.step-dis/s[j][net.y].v;
if(timee<)
break;
if(timee%s[j][net.y].t==)
{
flag = ;
break;
}
}
if(s[j][net.y].t)
break;
}
if(!flag)
continue;
for(j = net.y-; j>=; j--)
{
if(s[net.x][j].t && s[net.x][j].c == 'E')
{
dis = net.y-j;
if(dis%s[net.x][j].v)
break;
timee = net.step-dis/s[net.x][j].v;
if(timee<)
break;
if(timee%s[net.x][j].t==)
{
flag = ;
break;
}
}
if(s[net.x][j].t)
break;
}
if(!flag)
continue;
for(j = net.y+; j<=m; j++)
{
if(s[net.x][j].t && s[net.x][j].c == 'W')
{
dis = j-net.y;
if(dis%s[net.x][j].v)
break;
timee = net.step-dis/s[net.x][j].v;
if(timee<)
break;
if(timee%s[net.x][j].t==)
{
flag = ;
break;
}
}
if(s[net.x][j].t)
break;
}
if(!flag)
continue;
vis[net.x][net.y][net.step] = true;
q.push(net);
}
}
}
cout<<"Bad luck!"<<endl;
} int main()
{
while(cin>>n>>m>>k>>life)
{
MEM(vis,);
MEM(s,);
for(int i=; i<k; i++)
{
char c;
int t,v,x,y;
cin>>c>>t>>v>>x>>y;
s[x][y].c=c;
s[x][y].t=t;
s[x][y].v=v;
}
bfs();
}
return ;
}

【HDU - 3533】Escape(bfs)的更多相关文章

  1. 【HDU - 3085】Nightmare Ⅱ(bfs)

    -->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...

  2. 【HDU 2853】Assignment (KM)

    Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...

  3. 【POJ - 3414】Pots(bfs)

    Pots 直接上中文 Descriptions: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i)        将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DRO ...

  4. 【Aizu - 0558】Cheese(bfs)

    -->Cheese 原文是日语,这里就写中文了 Descriptions: 在H * W的地图上有N个奶酪工厂,每个工厂分别生产硬度为1-N的奶酪.有一只老鼠准备从出发点吃遍每一个工厂的奶酪.老 ...

  5. 【HDU - 4345 】Permutation(DP)

    BUPT2017 wintertraining(15) #8F 题意 1到n的排列,经过几次置换(也是一个排列)回到原来的排列,就是循环了. 现在给n(<=1000),求循环周期的所有可能数. ...

  6. 【HDU 6005】Pandaland(Dijkstra)

    Problem Description Mr. Panda lives in Pandaland. There are many cities in Pandaland. Each city can ...

  7. 【HDU - 6581】Vacation(思维)

    Vacation 题意 有n+1辆车,属性有长度l,距离终点的距离s,速度v问你最末尾的车到达终点的时间 Sample Input 1 2 2 7 1 2 1 2 1 2 2 10 7 1 6 2 1 ...

  8. 【HDU 5750】Dertouzos(数学)

    题目给定n和d,都是10的9次方以内,求1到n里面有几个数最大因数是d?1000000组数据.解:求出d的满足p[i]*d<n的最小质因数是第几个质数.即为答案. #include<cst ...

  9. 【HDU 2955】Robberies(DP)

    题意是给你抢劫每个银行可获得的钱m和被抓的概率p,求被抓的概率小于P,最多能抢多少钱.01背包问题,体积是m,价值是p.被抓的概率不是简单相加,而应该是1−Π(1−p[i])DP:dp[i]表示抢到i ...

随机推荐

  1. 正试图在 os 加载程序锁内执行托管代码

    正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码... 当我在窗体初始化的时候,调用了一个外部的dill时,它就不知什么原因的 抛出一个“正试图在 ...

  2. 【SQL Server】SQL Server占用CPU使用率100%的解决方法

    原文:[SQL Server]SQL Server占用CPU使用率100%的解决方法 近日,帮一个客户解决了服务器CPU占用率高达100%的问题. 以前做的一个某污水处理厂自控系统项目,客户反映其自控 ...

  3. Microsoft .NET Framework 3.5 SP1安装错误 1603

    ghost版安装时由于系统简化引起上述错误,你按下面方法试一下1.点击电脑桌面右下角的“开始”按钮,点击“运行”按钮,在弹出的节目输入框中输入“regedit”.2.在弹出来的“注册表编辑器”界面上, ...

  4. 在Azure中搭建Ghost博客并绑定自定义域名和HTTPS

    绪论 之前一直使用cnblog写博客,现在将博客迁移至Microsoft Azure上的Ghost博客上,Ghost博客使用Markdown书写博客,页面简洁,是我喜欢的风格.具体参见官网:https ...

  5. UAP开发错误之The given System.Uri cannot be converted into a Windows.Foundation.Uri(windows phone背景更换)

    今天博主在开发一款windows phone应用时,希望实现app背景的更换,思路很简单.使用ApplicationDataContainer容器存储我的图片路径,每次载入应用时读取这个路径以决定我用 ...

  6. QT---Winsocket获取网关(Gateway) 主机IP等信息

      基于WinPcap库做开发,需要利用到局域网的默认网关地址和Mac地址,但是WinPcap实现获取网关IP地址没有很好的思路,可以知道的是网关的接收和发出的数据包数量一般是比局域网内的各主机要多的 ...

  7. Laravel --- Laravel 5.3 队列使用方法

    一.设置存储方式 在config/queue.php中查看队列驱动,在.env 设置[QUEUE_DRIVER] 主要介绍数据库驱动 二.数据库驱动 1.修改.env CACHE_DRIVER=fil ...

  8. OpenDaylight即将迈入“七年之痒”?

    前段时间看到一篇文章,叫<OpenStack已死?>,讲述了OpenStack自2010年提出之后的9年间各方利益牵扯导致的一系列问题,尽管最终作者的结论是OpenStack现在只是进入了 ...

  9. 干货!Git 如何使用多个托管平台管理代码

    考虑到github不能免费创建私有仓库原因,最近开始在使用码云托管项目,这样避免了连接数据库的用户密码等信息直接暴露在公共仓库中.今天突然想到一个点,就是能不能同时把代码推送到github和码云上呢? ...

  10. java源码解析之String类(四)

    /* * 返回指定字符第一次出现的字符串内的索引 */ public int indexOf(int ch) { return indexOf(ch, 0); } /* * 返回指定字符第一次出现的字 ...