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. 【转】app后端如何选择合适的数据库产品

    转自:http://blog.csdn.net/newjueqi/article/details/44003503 app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis ...

  2. Ruby自学笔记(一)— 基本概况

    之前一直想要多看看RESTful Service相关的东西,找到一本相关的书,但是里面的代码都是用Ruby写的,虽然知道编程语言都是类似的,但是看到一些陌生的语法,还是有些摸不着头脑,所以最近终于下定 ...

  3. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]

    题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...

  4. Unity3d IOS中的IGUI控件

    Unity3d IOS中的IGUI控件 @灰太龙  群63438968 我讲一下IOS中用的UI,我们采用IGUI,需要使用IGUI的高版本,在Unity3d 4.2中也可以使用的! 之前IGUI有个 ...

  5. codeforces D. Painting The Wall

    http://codeforces.com/problemset/problem/399/D 题意:给出n和m,表示在一个n*n的平面上有n*n个方格,其中有m块已经涂色.现在随机选中一块进行涂色(如 ...

  6. UIPickerView 地区解析 -- 全国省、市、区 plist 解析 -- 读取UIPickerView 当前显示内容

    一个简单的plist 解析过程,借助UIPickerView 实现了手选全国的 省市区 方法, 源码中有详细注释:长句自己可以拆开看,最好的方法是,拆开,并打印,查看每一步打印的结果,结合Plist文 ...

  7. 【POJ】3283 Card Hands

    字典树. #include <iostream> #include <cstdio> #include <cstring> #include <string& ...

  8. cscope使用

    [[]][]再加上][一共是 4 个在段落(对于 C 来讲就是函数)间跳转的命令. 总结是:1,相同就跳到函数的开头:(如果都是左括号或者都是右括号),不同就跳到函数的结尾:     { 和 } 用来 ...

  9. Qt入门(19)——自定义窗口部件

    我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange().        void setRange( int minVal, int maxV ...

  10. ACM生活总结

    两年ACM生活总结 转眼已经踏入ACM这条不归路已经两年了, 深深的感觉到ACM的不易 和 艰辛,但同时ACM给我所带来的快乐,让我认为值一切都是值得的. 我刚上大学那会,我们学校的ACM刚刚起步不到 ...