Escape

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 598    Accepted Submission(s): 153

Problem Description
The students of the HEU are maneuvering for their military training.
The red army and the blue army are at war today. The blue army finds that Little A is the spy of the red army, so Little A has to escape from the headquarters of the blue army to that of the red army. The battle field is a rectangle of size m*n, and the headquarters of the blue army and the red army are placed at (0, 0) and (m, n), respectively, which means that Little A will go from (0, 0) to (m, n). The picture below denotes the shape of the battle field and the notation of directions that we will use later.

The blue army is eager to revenge, so it tries its best to kill Little A during his escape. The blue army places many castles, which will shoot to a fixed direction periodically. It costs Little A one unit of energy per second, whether he moves or not. If he uses up all his energy or gets shot at sometime, then he fails. Little A can move north, south, east or west, one unit per second. Note he may stay at times in order not to be shot.
To simplify the problem, let’s assume that Little A cannot stop in the middle of a second. He will neither get shot nor block the bullet during his move, which means that a bullet can only kill Little A at positions with integer coordinates. Consider the example below. The bullet moves from (0, 3) to (0, 0) at the speed of 3 units per second, and Little A moves from (0, 0) to (0, 1) at the speed of 1 unit per second. Then Little A is not killed. But if the bullet moves 2 units per second in the above example, Little A will be killed at (0, 1).
Now, please tell Little A whether he can escape.

 
Input
For every test case, the first line has four integers, m, n, k and d (2<=m, n<=100, 0<=k<=100, m+ n<=d<=1000). m and n are the size of the battle ground, k is the number of castles and d is the units of energy Little A initially has. The next k lines describe the castles each. Each line contains a character c and four integers, t, v, x and y. Here c is ‘N’, ‘S’, ‘E’ or ‘W’ giving the direction to which the castle shoots, t is the period, v is the velocity of the bullets shot (i.e. units passed per second), and (x, y) is the location of the castle. Here we suppose that if a castle is shot by other castles, it will block others’ shots but will NOT be destroyed. And two bullets will pass each other without affecting their directions and velocities.
All castles begin to shoot when Little A starts to escape.
Proceed to the end of file.
 
Output
If Little A can escape, print the minimum time required in seconds on a single line. Otherwise print “Bad luck!” without quotes.
 
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!
 
Source
 
题意:
一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y
问这个人能不能安全到达终点
要求: 
1.人不能到达炮塔所在的坐标
2.炮塔会挡住子弹
3.途中遇到子弹是安全的,但是人如果停在这个坐标,而子弹也刚好到这个坐标,人就被射死
4.人可以选择停止不动
 
思路:其实不难,我们只需要看当人位于某个点的时候,其四个方向是否有炮塔,这个炮塔是都向人的方向射击,然后再看子弹是否刚好位于这个坐标即可。
而标记的话,vis[x][y][time],对于time时刻,人位于x,y的情况只需要访问一次,这是唯一的
我的代码:
/*************************************************************************
> File Name: hdu_3533.cpp
> Author: Howe_Young
> Mail: 1013410795@qq.com
> Created Time: 2015年04月28日 星期二 19时14分24秒
************************************************************************/ #include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue> using namespace std;
const int maxn = ;
const int Next[][] = {, , , , , -, -, , , };//可以四个方向,也可以呆在原地不动
int n, m, k, d;
struct castle{//碉堡
char dir;//炮塔方向
int t, v;//t是周期,v是速度
};
struct Node{
int x, y, step;
};
castle bullet[maxn][maxn];
bool vis[maxn][maxn][];
bool check(Node node)
{
return (node.x < || node.y < || node.x > m || node.y > n);
}
void bfs()
{
memset(vis, false, sizeof(vis));
queue<Node> Q;
Node cur, next;
cur.x = cur.y = cur.step = ;
vis[][][] = true;
Q.push(cur);
while (!Q.empty())
{
bool flag;
cur = Q.front();
Q.pop();
if (cur.step > d)
break;
if (cur.x == m && cur.y == n)
{
printf("%d\n", cur.step);
return;
}
for (int i = ; i < ; i++)
{
next.x = cur.x + Next[i][];
next.y = cur.y + Next[i][];
next.step = cur.step + ;
if (check(next))
continue;
//这里前面那个是判断此点是否有碉堡,如果有碉堡的话不能走
if (bullet[next.x][next.y].t == && !vis[next.x][next.y][next.step] && next.step <= d)
{
flag = true;
for (int j = next.x - ; j >= ; j--)//向上找有没有碉堡
{
if (bullet[j][next.y].t != && bullet[j][next.y].dir == 'S')//说明有碉堡.并且朝南
{
int dis = next.x - j;//碉堡与人的距离
if (dis % bullet[j][next.y].v != )//如果不能整除的话,说明子弹在这个点时肯定不是整点,所以直接跳过
break;
int tmp = next.step - dis / bullet[j][next.y].v;//人走的总时间减去第一颗子弹到这需要多少时间
if (tmp < )//如果人到这,子弹还到不了,所以安全,直接跳过
break;
if (tmp % bullet[j][next.y].t == )//如果子弹正好到这,这时人就被打死了
{
flag = false;
break;
}
}
if (bullet[j][next.y].t != )//如果炮塔不朝南的话就直接挡住子弹了
break;
}
if (!flag)
continue;
//下面其他三个方向同理
for (int j = next.x + ; j <= m; j++)
{
if (bullet[j][next.y].t != && bullet[j][next.y].dir == 'N')
{
int dis = j - next.x;
if (dis % bullet[j][next.y].v != )
break;
int tmp = next.step - dis / bullet[j][next.y].v;
if (tmp < )
break;
if (tmp % bullet[j][next.y].t == )
{
flag = false;
break;
}
}
if (bullet[j][next.y].t != )
break;
}
if (!flag)
continue;
for (int j = next.y - ; j >= ; j--)
{
if (bullet[next.x][j].t != && bullet[next.x][j].dir == 'E')
{
int dis = next.y - j;
if (dis % bullet[next.x][j].v != )
break;
int tmp = next.step - dis / bullet[next.x][j].v;
if (tmp < )
break;
if (tmp % bullet[next.x][j].t == )
{
flag = false;
break;
}
}
if (bullet[next.x][j].t != )
break;
}
if (!flag)
continue;
for (int j = next.y + ; j <= n; j++)
{
if (bullet[next.x][j].t != && bullet[next.x][j].dir == 'W')
{
int dis = j - next.y;
if (dis % bullet[next.x][j].v != )
break;
int tmp = next.step - dis / bullet[next.x][j].v;
if (tmp < )
break;
if (tmp % bullet[next.x][j].t == )
{
flag = false;
break;
}
}
if (bullet[next.x][j].t != )
break;
}
if (!flag)
continue;
vis[next.x][next.y][next.step] = true;
Q.push(next);
}
}
}
printf("Bad luck!\n");
}
int main()
{
while (~scanf("%d %d %d %d", &m, &n, &k, &d))
{
char ch;
int a, b, c, d;
memset(bullet, , sizeof(bullet));
for (int i = ; i < k; i++)
{
cin >> ch >> a >> b >> c >> d;
bullet[c][d].dir = ch;
bullet[c][d].t = a;
bullet[c][d].v = b;
}
bfs();
}
return ;
}

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

  1. HDU 3533 Escape bfs 难度:1

    http://acm.hdu.edu.cn/showproblem.php?pid=3533 一道普通的bfs,但是由于代码实现出了bug还是拖了很久甚至对拍了 需要注意的是: 1.人不能经过炮台 2 ...

  2. HDU 3533 Escape (BFS + 预处理)

    Escape Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. HDU 3533 Escape BFS搜索

    题意:懒得说了 分析:开个no[100][100][1000]的bool类型的数组就行了,没啥可说的 #include <iostream> #include <cstdio> ...

  4. 【搜索】 HDU 3533 Escape BFS 预处理

    要从0,0 点 跑到m,n点  路上会有k个堡垒发射子弹.有子弹的地方不能走,子弹打到别的堡垒就会消失,或者一直飞出边界(人不能经过堡垒 能够上下左右或者站着不动 每步都须要消耗能量  一共同拥有en ...

  5. HDU 3533 Escape(大逃亡)

    HDU 3533 Escape(大逃亡) /K (Java/Others)   Problem Description - 题目描述 The students of the HEU are maneu ...

  6. HDU 3533 Escape(BFS+预处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3533 题目大意:给你一张n* m的地图,人在起点在(0,0)要到达终点(n,m)有k(k<=10 ...

  7. HDU3533 Escape —— BFS / A*算法 + 预处理

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3533 Escape Time Limit: 20000/10000 MS (Java/Others)  ...

  8. HDU 3605 Escape (网络流,最大流,位运算压缩)

    HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...

  9. Hdu 3605 Escape (最大流 + 缩点)

    题目链接: Hdu 3605  Escape 题目描述: 有n个人要迁移到m个星球,每个星球有最大容量,每个人有喜欢的星球,问是否所有的人都能迁移成功? 解题思路: 正常情况下建图,不会爆内存,但是T ...

随机推荐

  1. iptables的设置

    一.filter表防火墙(过滤器) iptables -A ( INPUT OUTPUT ) -s 192.1680.1.200 -p ( TCP UDP ICMP ) -i ( eth0 eth1 ...

  2. 原 IOS之NSValue整理

    原 IOS之NSValue整理 发表于2年前(2013-02-28 23:02)   阅读(1974) | 评论(0) 5人收藏此文章, 我要收藏 赞3 IOS NSValue 值对象(value o ...

  3. Tautology

    WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some subset of th ...

  4. h.264语法结构分析

    NAL Unit Stream Network Abstraction Layer,简称NAL. h.264把原始的yuv文件编码成码流文件,生成的码流文件就是NAL单元流(NAL unit Stre ...

  5. Response对象

    Response对象来自HttpResponse类,它用于向客户端输出信息或设置客户端输出状态,使用Response对象可以直接发送信息给浏览器.重定向浏览器到另一个URL或设置cookie的值等. ...

  6. 获取Delphi所有类的类信息

    Delphi遍历进程中所有Class的TypeInfo,即便是在implementation中的class或者其他 class的private的子class. 一般普通EXE中的TypeInfo存放在 ...

  7. java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码

    java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定 ...

  8. Struts2 权限验证

    之前的Struts2项目通过再Sitemesh的母版页中使用Struts的if标签进行了session判断,使得未登录的用户不能看到页面,但是这 种现仅仅在view层进行,如果未登录用户直接在地址栏输 ...

  9. POJ2442 Sequence

    题目链接. #include <iostream> #include <cstdio> #include <cstring> #include <cstdli ...

  10. phpMyAdmin 完整路径泄露漏洞

    漏洞名称: phpMyAdmin 完整路径泄露漏洞 CNNVD编号: CNNVD-201307-650 发布时间: 2013-08-09 更新时间: 2013-08-09 危害等级: 中危   漏洞类 ...