题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3533

题目大意:给你一张n* m的地图,人在起点在(0,0)要到达终点(n,m)有k(k<=100)座炮台,每座炮台都有各自的发射方向、发射周期和发射速度,每隔一段时间会发射一定速度的炮弹,人每秒可以选择停在原地或者往上下左右走,问是否能在时间d之内安全到达终点。如果可以,请输出最短时间。

解题思路:BFS+预处理,分为以下几点:

     ①预处理,用step[x][y][t]记录(x,y)在时间t是否被炮弹打到,这样在bfs时直接判断step就可以了。要注意炮台是可以挡住子弹的(比如从(0,0)到(0,3)如果(0,2)有炮台那就会被挡住,开始没注意半路被炮台挡住,而是只管每秒发射到的点,GG。。。),还有炮台所在地也是不能走的,所以要不要边输入炮台信息边计算step,因为后面输入的炮台可能会档子弹的,输完再预处理。

     ②BFS,要用vis[x][y][t]表示(x,y)这个点在时间t已经走过了,判重,记得要判断(t>lim)是直接返回false,否则会出错(不一定,反正我的会)。

     ③数组记得用bool型,否则会超内存。

代码:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<string>
using namespace std;
const int N=1e2+; int m,n,k,lim,ans;
int d[][]={{-,},{,},{,-},{,},{,}};
bool attack[N][N][];//判断(x,y)在时间t是否被炮台攻击
bool vis[N][N][];//判断t时刻在(x,y) 的状态是否出现过,判重 struct node{
int x,y,step;
}pre,now; struct node1{
int c,v,t,x,y;
}a[N]; bool bfs(){
queue<node>q;
now.x=;
now.y=;
now.step=;
q.push(now);
while(!q.empty()){
pre=q.front();
q.pop();
for(int i=;i<;i++){
int xx=pre.x+d[i][];
int yy=pre.y+d[i][];
int t=pre.step+;
//时间不能超过lim
if(t>lim)
continue;
if(xx<||yy<||xx>n||yy>m)
continue;
if(vis[xx][yy][t]||attack[xx][yy][t]||attack[xx][yy][])
continue;
if(xx==n&&yy==m){
ans=t;
return true;
}
vis[xx][yy][t]=true;
now.x=xx;
now.y=yy;
now.step=t;
q.push(now);
}
}
return false;
} int main(){
while(~scanf("%d%d%d%d",&n,&m,&k,&lim)){
memset(vis,false,sizeof(vis));
memset(attack,false,sizeof(attack));
for(int i=;i<=k;i++){
getchar();
scanf("%c%d%d%d%d",&a[i].c,&a[i].t,&a[i].v,&a[i].x,&a[i].y);
//表示这个位置有炮台
attack[a[i].x][a[i].y][]=true;
} for(int i=;i<=k;i++){
char c;
int t,v,x,y;
c=a[i].c,t=a[i].t,v=a[i].v,x=a[i].x,y=a[i].y;
int idx;
if(c=='N')
idx=;
if(c=='S')
idx=;
if(c=='W')
idx=;
if(c=='E')
idx=;
int tmp=;
while(){
int xx=x+d[idx][]*v*tmp;
int yy=y+d[idx][]*v*tmp;
if(xx<||yy<||xx>n||yy>m)
break;
bool flag=false;
//判断中途是否有炮台挡住子弹
for(int j=+v*(tmp-);j<=v*tmp;j++){
int tx=x+d[idx][]*j;
int ty=y+d[idx][]*j;
if(attack[tx][ty][]){
flag=true;
break;
}
}
if(flag)
break;
//根据周期,计算被子弹攻击的时间
int tt=tmp;
while(tt<=){
attack[xx][yy][tt]=true;
tt+=t;
}
tmp++;
}
}
if(bfs())
printf("%d\n",ans);
else
puts("Bad luck!");
}
return ;
}

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

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

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

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

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

  3. HDU 3533 Escape bfs 难度:1

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

  4. HDU 3533 Escape(bfs)

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

  5. HDU 3533 Escape BFS搜索

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

  6. HDU 3533 Escape(大逃亡)

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

  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. 【BZOJ3203】保护出题人(动态规划,斜率优化)

    [BZOJ3203]保护出题人(动态规划,斜率优化) 题面 BZOJ 洛谷 题解 在最优情况下,肯定是存在某只僵尸在到达重点的那一瞬间将其打死 我们现在知道了每只僵尸到达终点的时间,因为僵尸要依次打死 ...

  2. 【BZOJ4300】绝世好题(动态规划)

    [BZOJ4300]绝世好题(动态规划) 题面 BZOJ Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=l ...

  3. Linux内核设计第三周学习总结 跟踪分析Linux内核的启动过程

    陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验步骤 登陆实验楼虚 ...

  4. SpringBoot web 小项目

    Spring Boot 整合 Thymeleaf 完整 Web 案例 原创出处  作者:泥瓦匠BYSocket 希望转载,保留摘要,谢谢! Thymeleaf 是一种模板语言.那模板语言或模板引擎是什 ...

  5. 【51nod1965】奇怪的式子

    Portal --> 51nod1965 Solution 怎么说呢..这题..做的有点痛苦.. 首先看这个式子长得..比较奇怪,指数里面那个加号有点烦人,而且这个函数不是一个积性函数也有点烦人 ...

  6. Linux之选取信息命令介绍与应用20170331

    在介绍选取信息命令之前,说一下管道符“|”与tr命令,因为在使用多个命令一起的时候经常用到它. 一.利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入. ...

  7. Linux之执行命令操作20170330

    介绍一下Linux系统中的代码执行shell等命令的几种操作方式: 一.标准流管道popen 该函数的原型是FILE * popen(const char* command, const char * ...

  8. python自学笔记(一)

    我没学过python,通过网上和一些图书资料,自学并且记下笔记. 很多细节留作以后自己做项目时再研究,这样能更高效一些. python基础自学笔记 一.基本输入和输出 pthon3.0用input提示 ...

  9. ACE服务端编程2:ACE跨平台之数据类型和宽字符

    ACE网络库的主要优势之一就是跨平台,ACE提供了操作系统API和编译器级别的跨平台解决方法,使开发人员不用再去关心操作系统和编译器的差异,但因此也带来了ACE的复杂性. ACE网络库的组织结构主要分 ...

  10. (转)C++常见问题: 字符串分割函数 split

    http://www.cnblogs.com/dfcao/p/cpp-FAQ-split.html C++标准库里面没有字符分割函数split ,这可太不方便了,我已经遇到>3次如何对字符串快速 ...