题目链接: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型,否则会超内存。

代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<queue>
  5. #include<string>
  6. using namespace std;
  7. const int N=1e2+;
  8.  
  9. int m,n,k,lim,ans;
  10. int d[][]={{-,},{,},{,-},{,},{,}};
  11. bool attack[N][N][];//判断(x,y)在时间t是否被炮台攻击
  12. bool vis[N][N][];//判断t时刻在(x,y) 的状态是否出现过,判重
  13.  
  14. struct node{
  15. int x,y,step;
  16. }pre,now;
  17.  
  18. struct node1{
  19. int c,v,t,x,y;
  20. }a[N];
  21.  
  22. bool bfs(){
  23. queue<node>q;
  24. now.x=;
  25. now.y=;
  26. now.step=;
  27. q.push(now);
  28. while(!q.empty()){
  29. pre=q.front();
  30. q.pop();
  31. for(int i=;i<;i++){
  32. int xx=pre.x+d[i][];
  33. int yy=pre.y+d[i][];
  34. int t=pre.step+;
  35. //时间不能超过lim
  36. if(t>lim)
  37. continue;
  38. if(xx<||yy<||xx>n||yy>m)
  39. continue;
  40. if(vis[xx][yy][t]||attack[xx][yy][t]||attack[xx][yy][])
  41. continue;
  42. if(xx==n&&yy==m){
  43. ans=t;
  44. return true;
  45. }
  46. vis[xx][yy][t]=true;
  47. now.x=xx;
  48. now.y=yy;
  49. now.step=t;
  50. q.push(now);
  51. }
  52. }
  53. return false;
  54. }
  55.  
  56. int main(){
  57. while(~scanf("%d%d%d%d",&n,&m,&k,&lim)){
  58. memset(vis,false,sizeof(vis));
  59. memset(attack,false,sizeof(attack));
  60. for(int i=;i<=k;i++){
  61. getchar();
  62. scanf("%c%d%d%d%d",&a[i].c,&a[i].t,&a[i].v,&a[i].x,&a[i].y);
  63. //表示这个位置有炮台
  64. attack[a[i].x][a[i].y][]=true;
  65. }
  66.  
  67. for(int i=;i<=k;i++){
  68. char c;
  69. int t,v,x,y;
  70. c=a[i].c,t=a[i].t,v=a[i].v,x=a[i].x,y=a[i].y;
  71. int idx;
  72. if(c=='N')
  73. idx=;
  74. if(c=='S')
  75. idx=;
  76. if(c=='W')
  77. idx=;
  78. if(c=='E')
  79. idx=;
  80. int tmp=;
  81. while(){
  82. int xx=x+d[idx][]*v*tmp;
  83. int yy=y+d[idx][]*v*tmp;
  84. if(xx<||yy<||xx>n||yy>m)
  85. break;
  86. bool flag=false;
  87. //判断中途是否有炮台挡住子弹
  88. for(int j=+v*(tmp-);j<=v*tmp;j++){
  89. int tx=x+d[idx][]*j;
  90. int ty=y+d[idx][]*j;
  91. if(attack[tx][ty][]){
  92. flag=true;
  93. break;
  94. }
  95. }
  96. if(flag)
  97. break;
  98. //根据周期,计算被子弹攻击的时间
  99. int tt=tmp;
  100. while(tt<=){
  101. attack[xx][yy][tt]=true;
  102. tt+=t;
  103. }
  104. tmp++;
  105. }
  106. }
  107. if(bfs())
  108. printf("%d\n",ans);
  109. else
  110. puts("Bad luck!");
  111. }
  112. return ;
  113. }

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. 【JavaScript】事件

    一.前言         继续上一章的内容,继续今天的Js学习. 二.内容         事件处理程序 事件就是用户或浏览器自身执行的某种动作.而响应某个事件的函数就叫做事件处理程序 //HTML事 ...

  2. Spring MVC 向前台页面传值-ModelAndView

    ModelAndView 该对象中包含了一个model属性和一个view属性 model:其实是一个ModelMap类型.其实ModelMap是一个LinkedHashMap的子类 view:包含了一 ...

  3. scrapy 采集网页出现丢失url的问题

    url_list = ["http://www.icoat.cc/news/list_18_3.html", "http://www.icoat.cc/news/list ...

  4. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  5. myeclipse注册机,自己生成注册码

    话不多少,直接上代码 直接可以运行,自己输入key即可 package com.generate.myeclipse.code; import java.io.BufferedReader; impo ...

  6. html常见页面动画插件

    wow.js页面滚动动画 scrollever.js页面滚动动画 textillate.js页面字体效果 ihover.js手表hover效果插件 loaders.css页面预加载动画

  7. github访问很慢的问题

    公司一直用着svn, 之前也的确用过github的版本管理,但是一直都是可视化的操作 这几天面试了几名前端,问了一下发现他们在之前的公司里都是用git的, 于是今天好好温故了一下怎么用命令行进行一下g ...

  8. 区间->点,点->区间,线段树优化建图+dijstra Codeforces Round #406 (Div. 2) D

    http://codeforces.com/contest/787/problem/D 题目大意:有n个点,三种有向边,这三种有向边一共加在一起有m个,然后起点是s,问,从s到所有点的最短路是多少? ...

  9. Linux命令学习-图形化界面命令开关闭

    su root password 1, 关闭图形界面: init 3 关闭图形界面(XServer服务也会关闭) 开启图形界面: init 5 或 startx 开机时,不进入 X Window: v ...

  10. 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包

    [题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...