Escape

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

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!
 
 
 
 
 
非常纠结的一题,做了很久才做出来,题意非常不清楚,不推荐这题。
坑点:有碉堡的点不能走,人不会往回走,终点可能有碉堡。
先把所有可能被炮弹打到的点以及它被炮弹打到的时间标记出来,时间上限是初始能量值,因为超过了这个值就不能再走了,标记也就没意义。然后bfs搜的时候,用VIS[x][y][t]来判重,即当前点是否在第t秒以及走过了,我还加入了个曼哈顿距离来剪枝,如果当前点的剩余能量小于到终点的曼哈顿距离,那么就剪掉。
注意,更新x和y的时候,不必考虑向西和向北,因为终点是在东南方,刚开始我不确定这样对不对,但是去掉这两个点后依然能A,当然,也许是数据不够强,某个角落里还存在着一组诡异的数据,需要先绕回去几步,谁知道呢。
 
 #include <iostream>
#include <cstdio>
#include <queue>
using namespace std; const int SIZE = ;
const int UPDATE[][] = {{,},{,},{,}};
int N,M,K,E;
bool FIRE[SIZE][SIZE][];
bool VIS[SIZE][SIZE][];
bool CASTLE[SIZE][SIZE];
struct Node
{
int x,y,t,e;
bool check(void)
{
if(x < || x > N || y < || y > M || t > E || VIS[x][y][t] || CASTLE[x][y] ||
FIRE[x][y][t] || !e || N - x + M - y > e)
return false;
return true;
}
};
struct Cas
{
char ch;
int t,v,x,y;
}; void deal(char ch,int t,int v,int x,int y);
void bfs(void);
int main(void)
{
Cas temp[];
while(scanf("%d%d%d%d",&N,&M,&K,&E) != EOF)
{
fill(&FIRE[][][],&FIRE[SIZE - ][SIZE - ][],false);
fill(&VIS[][][],&VIS[SIZE - ][SIZE - ][],false);
fill(&CASTLE[][],&CASTLE[SIZE - ][SIZE - ],false); for(int i = ;i < K;i ++)
{
scanf(" %c%d%d%d%d",&temp[i].ch,&temp[i].t,&temp[i].v,&temp[i].x,&temp[i].y);
CASTLE[temp[i].x][temp[i].y] = true;
}
if(CASTLE[N][M])
{
puts("Bad luck!");
continue;
}
for(int i = ;i < K;i ++)
deal(temp[i].ch,temp[i].t,temp[i].v,temp[i].x,temp[i].y);
bfs();
} return ;
} void deal(char ch,int t,int v,int x,int y)
{
if(ch == 'W')
{
int stop = ;
for(int j = y - ;j >= ;j --)
if(CASTLE[x][j])
{
stop = j;
break;
}
for(int j = y - v,ini = ;j >= stop;j -= v,ini ++)
for(int k = ini;k <= E;k += t)
FIRE[x][j][k] = true; }
else if(ch == 'E')
{
int stop = M;
for(int j = y + ;j <= M;j ++)
if(CASTLE[x][j])
{
stop = j;
break;
} for(int j = y + v,ini = ;j <= stop;j += v,ini ++)
for(int k = ini;k <= E;k += t)
FIRE[x][j][k] = true;
}
else if(ch == 'N')
{
int stop = ;
for(int j = x - ;j >= ;j --)
if(CASTLE[j][y])
{
stop = j;
break;
}
for(int j = x - v,ini = ;j >= stop;j -= v,ini ++)
for(int k = ini;k <= E;k += t)
FIRE[j][y][k] = true;
}
else if(ch == 'S')
{
int stop = N;
for(int j = x + ;j <= N;j ++)
if(CASTLE[j][y])
{
stop = j;
break;
}
for(int j = x + v,ini = ;j <= stop;j += v,ini ++)
for(int k = ini;k <= E;k += t)
FIRE[j][y][k] = true;
}
} void bfs(void)
{
Node first;
first.x = first.y = first.t = ;
first.e = E;
queue<Node> que;
que.push(first);
VIS[][][] = true; while(!que.empty())
{
Node cur = que.front();
que.pop(); for(int i = ;i < ;i ++)
{
Node next = cur;
next.x += UPDATE[i][];
next.y += UPDATE[i][];
next.t ++;
next.e --;
if(!next.check())
continue;
if(next.x == N && next.y == M)
{
printf("%d\n",next.t);
return ;
}
VIS[next.x][next.y][next.t] = true;
que.push(next);
}
}
puts("Bad luck!");
}

HDU 3533 Escape (BFS + 预处理)的更多相关文章

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

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

  2. HDU 3533 Escape bfs 难度:1

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

  3. HDU 3533 Escape(bfs)

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

  4. HDU 3533 Escape BFS搜索

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

  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. POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)

    思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...

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

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

  9. HDU - 1430 魔板 (bfs预处理 + 康托)

    对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...

随机推荐

  1. Java邮件服务学习之二:SMTP和POP3

    一.SMTP SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则.SMTP协议属于TCP/IP协议簇,它帮助每台计算 ...

  2. js特效-仿照html属性title写一个弹出标题样式

    问题场景:商品描述,当营业员给客户介绍时会看着这些弹出标题来给客户讲解描述,一般采用html中属性title来实现,但是有些商品描述太长,这些title在IE浏览器中大约展示5s,营业员需要多次移动鼠 ...

  3. Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

    servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...

  4. [iOS UI进阶 - 2.4] 彩票Demo v1.4 转盘动画

    A.需求 幸运广场界面中有一个幸运转盘,平时能够自动缓缓转动 能够选择星座 点击“开始选号”开速旋转转盘,旋转一定周数 转盘转动速度节奏:开始-慢-块-慢-结束 设置其余的背景和按钮   code s ...

  5. VB.NET开发中遇到的一个小问题

    在修改公司用vb.net的写的代码时,遇到一个小问题 页面上有一个button, ID是btnNext, 在属性页中,它的click事件对应的是cmdNext, 我像在c#中一样,在属性页中双击cmd ...

  6. OS X Git连接github

    1. 运行到.local 2. cd ~/.ssh查看文件是否存在 3. ssh-keygen(创建public & private key) 4. 或者运行如下命令:cd ~/.ssh &a ...

  7. List、ArrayList、Vector及map、HashTable、HashMap分别的区别

    一.List与ArrayList的区别      List->AbstractList->ArrayList     (1) List是一个接口,ArrayList是一个实现了List接口 ...

  8. wsus客户端/服务器检查更新

    wuauclt /detectnow 客户端检查更新 Wuauclt.exe是Windows自动升级管理程序.该进程会不断在线检测更新 wsusutil.exe wsus服务器命令行工具

  9. 【转】adns解析库——域名解析实例(C++、linux)

    转自:http://blog.csdn.net/fty8788/article/details/7480334 adns是一个开源的dns解析库 官方文档:http://www.chiark.gree ...

  10. String类的实现

    1.在类中可以访问private成员包括两层含义:可以访问this指针的private成员:可以访问同类对象的private成员. 2.这里的String可以认为是个资源管理类,内部有个char指针, ...