Escape

 Descriptions:

一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y
问这个人能不能安全到达终点
要求: 
1.人不能到达炮塔所在的坐标
2.炮塔会挡住子弹
3.途中遇到子弹是安全的,但是人如果停在这个坐标,而子弹也刚好到这个坐标,人就被射死
4.人可以选择停止不动

Input

对于每个测试用例,第一行有四个整数,m、n、k和d (2<=m, n<=100, 0<=k<=100, m+ n<=d<=1000)。m和n是战场的大小,k是城堡的数量,d是A最初拥有的能量单位。接下来的k行分别描述了这些城堡。每一行包含一个字符c和四个整数,t, v, x和y。c是“N”,“S”,“E”或“W”给城堡的发射方向,t, v是子弹的速度(即单位通过每秒),和(x, y)是城堡的位置。这里我们假设,如果一座城堡被其他城堡击中,它会挡住其他人的射击,但不会被摧毁。两颗子弹会在不影响它们的方向和速度的情况下擦肩而过。

当小A开始逃跑时,所有的城堡都开始射击。

继续到文件末尾。


Output

如果小A能逃跑,在一行中输入其所需的最小秒数。否则,在一行中输出"Bad luck!"(无需带引号)


Sample Input

  1. 4 4 3 10
  2. N 1 1 1 1
  3. W 1 1 3 2
  4. W 2 1 2 4
  5. 4 4 3 10
  6. N 1 1 1 1
  7. W 1 1 3 2
  8. W 1 1 2 4

Sample Output

  1. 9
  2. Bad luck!

题目链接

https://vjudge.net/problem/HDU-3533

其实不难,我们只需要看当人位于某个点的时候,其四个方向是否有炮塔,这个炮塔是都向人的方向射击,然后再看子弹是否刚好位于这个坐标即可。
而标记的话,vis[x][y][time],对于time时刻,人位于x,y的情况只需要访问一次,这是唯一的
 
AC代码
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <fstream>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <deque>
  7. #include <vector>
  8. #include <queue>
  9. #include <string>
  10. #include <cstring>
  11. #include <map>
  12. #include <stack>
  13. #include <set>
  14. #include <sstream>
  15. #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
  16. #define Mod 1000000007
  17. #define eps 1e-6
  18. #define ll long long
  19. #define INF 0x3f3f3f3f
  20. #define MEM(x,y) memset(x,y,sizeof(x))
  21. #define Maxn 105
  22. using namespace std;
  23. int n,m,k,life;
  24. int dt[][] = {,,,,,-,-,,,};//四个方向与停止不动的走法
  25. int map[][];
  26. bool vis[][][];
  27.  
  28. struct period
  29. {
  30. char c;
  31. int t,v;
  32. } s[][];
  33.  
  34. struct node
  35. {
  36. int x,y,step;
  37. };
  38.  
  39. int check(int x,int y)
  40. {
  41. if(x< || x>n || y< || y>m)
  42. return ;
  43. return ;
  44. }
  45.  
  46. void bfs()
  47. {
  48. node now,net;
  49. queue<node> q;
  50. int i,j,flag,dis,timee;
  51. now.x = now.y = now.step = ;
  52. q.push(now);
  53. vis[][][] = true;
  54. while(!q.empty())
  55. {
  56. now = q.front();
  57. q.pop();
  58. if(now.step>life)
  59. break;
  60. if(now.x == n && now.y == m)
  61. {
  62. cout<<now.step<<endl;
  63. return ;
  64. }
  65. for(i = ; i<; i++)
  66. {
  67. net = now;
  68. net.x+=dt[i][];
  69. net.y+=dt[i][];
  70. net.step++;
  71. if(check(net.x,net.y))
  72. continue;
  73. if(!s[net.x][net.y].t && !vis[net.x][net.y][net.step] && net.step<=life)//在符合条件的情况下,枚举四个方向
  74. {
  75. flag = ;
  76. for(j = net.x-; j>=; j--)//当位于这点,我们往北向寻找是否有朝南方向射击的炮台
  77. {
  78. if(s[j][net.y].t && s[j][net.y].c == 'S')//找到第一个炮台,且这个炮台是朝南射击的
  79. {
  80. dis = net.x-j;//看炮台与人的距离
  81. if(dis%s[j][net.y].v)
  82. break;//因为不需要看子弹中途的点,子弹每一秒跑v,距离是dis,dis不能整除v的话,那么子弹是不可能停在这个点的
  83. timee = net.step-dis/s[j][net.y].v;//人走的时间减去第一个子弹飞行到这个位置所需的时间
  84. if(timee<)
  85. break;//为负数就是第一个子弹都没有经过这个点,那么人绝对安全
  86. if(timee%s[j][net.y].t==)//看间隔,能整除,那么就是后续有子弹刚好到这个点,人死定了
  87. {
  88. flag = ;
  89. break;
  90. }
  91. }
  92. if(s[j][net.y].t)//找到炮台但不是朝南射击,那么这个炮台会当下后面所有子弹,所以北方向安全我们不需要再找
  93. break;
  94. }
  95. if(!flag)//这个方向都死定了,后面也就不需要看了
  96. continue;
  97. //其他方向也是一样的道理,就不注释了
  98. for(j = net.x+; j<=n; j++)
  99. {
  100. if(s[j][net.y].t && s[j][net.y].c == 'N')
  101. {
  102. dis = j-net.x;
  103. if(dis%s[j][net.y].v)
  104. break;
  105. timee = net.step-dis/s[j][net.y].v;
  106. if(timee<)
  107. break;
  108. if(timee%s[j][net.y].t==)
  109. {
  110. flag = ;
  111. break;
  112. }
  113. }
  114. if(s[j][net.y].t)
  115. break;
  116. }
  117. if(!flag)
  118. continue;
  119. for(j = net.y-; j>=; j--)
  120. {
  121. if(s[net.x][j].t && s[net.x][j].c == 'E')
  122. {
  123. dis = net.y-j;
  124. if(dis%s[net.x][j].v)
  125. break;
  126. timee = net.step-dis/s[net.x][j].v;
  127. if(timee<)
  128. break;
  129. if(timee%s[net.x][j].t==)
  130. {
  131. flag = ;
  132. break;
  133. }
  134. }
  135. if(s[net.x][j].t)
  136. break;
  137. }
  138. if(!flag)
  139. continue;
  140. for(j = net.y+; j<=m; j++)
  141. {
  142. if(s[net.x][j].t && s[net.x][j].c == 'W')
  143. {
  144. dis = j-net.y;
  145. if(dis%s[net.x][j].v)
  146. break;
  147. timee = net.step-dis/s[net.x][j].v;
  148. if(timee<)
  149. break;
  150. if(timee%s[net.x][j].t==)
  151. {
  152. flag = ;
  153. break;
  154. }
  155. }
  156. if(s[net.x][j].t)
  157. break;
  158. }
  159. if(!flag)
  160. continue;
  161. vis[net.x][net.y][net.step] = true;
  162. q.push(net);
  163. }
  164. }
  165. }
  166. cout<<"Bad luck!"<<endl;
  167. }
  168.  
  169. int main()
  170. {
  171. while(cin>>n>>m>>k>>life)
  172. {
  173. MEM(vis,);
  174. MEM(s,);
  175. for(int i=; i<k; i++)
  176. {
  177. char c;
  178. int t,v,x,y;
  179. cin>>c>>t>>v>>x>>y;
  180. s[x][y].c=c;
  181. s[x][y].t=t;
  182. s[x][y].v=v;
  183. }
  184. bfs();
  185. }
  186. return ;
  187. }

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

  1. 【HDU - 3085】Nightmare Ⅱ(bfs)

    -->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...

  2. 【HDU 2853】Assignment (KM)

    Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...

  3. 【POJ - 3414】Pots(bfs)

    Pots 直接上中文 Descriptions: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i)        将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DRO ...

  4. 【Aizu - 0558】Cheese(bfs)

    -->Cheese 原文是日语,这里就写中文了 Descriptions: 在H * W的地图上有N个奶酪工厂,每个工厂分别生产硬度为1-N的奶酪.有一只老鼠准备从出发点吃遍每一个工厂的奶酪.老 ...

  5. 【HDU - 4345 】Permutation(DP)

    BUPT2017 wintertraining(15) #8F 题意 1到n的排列,经过几次置换(也是一个排列)回到原来的排列,就是循环了. 现在给n(<=1000),求循环周期的所有可能数. ...

  6. 【HDU 6005】Pandaland(Dijkstra)

    Problem Description Mr. Panda lives in Pandaland. There are many cities in Pandaland. Each city can ...

  7. 【HDU - 6581】Vacation(思维)

    Vacation 题意 有n+1辆车,属性有长度l,距离终点的距离s,速度v问你最末尾的车到达终点的时间 Sample Input 1 2 2 7 1 2 1 2 1 2 2 10 7 1 6 2 1 ...

  8. 【HDU 5750】Dertouzos(数学)

    题目给定n和d,都是10的9次方以内,求1到n里面有几个数最大因数是d?1000000组数据.解:求出d的满足p[i]*d<n的最小质因数是第几个质数.即为答案. #include<cst ...

  9. 【HDU 2955】Robberies(DP)

    题意是给你抢劫每个银行可获得的钱m和被抓的概率p,求被抓的概率小于P,最多能抢多少钱.01背包问题,体积是m,价值是p.被抓的概率不是简单相加,而应该是1−Π(1−p[i])DP:dp[i]表示抢到i ...

随机推荐

  1. Android零基础入门第48节:可折叠列表ExpandableListView

    原文:Android零基础入门第48节:可折叠列表ExpandableListView 上一期学习了AutoCompleteTextView和MultiAutoCompleteTextView,你已经 ...

  2. postgresql Java JDBC 一次性传入多个参数到 in ( ?) - multple/list parameters

    经常不清楚需要传入多少个参数到 IN () 里面,下面是简单方法: 方法 1 - in ( SELECT * FROM unnest(?)) ) Integer[] ids={1,2,3};      ...

  3. 使用mingw编译完整Qt5的过程(使用了niXman的msys套装)good

    使用mingw编译完整Qt5的过程 坛子里似乎已经有人编译出Qt5了,不过大多有问题,不是缺少opengl就是缺少openssl,还有缺少webkit的,本文提供的仍然不能说是绝对完整的,不过相对以前 ...

  4. 最短JS判断IE6/IE7/IE8系列的写法

    常用的 var isIE=!!window.ActiveXObject; var isIE6=isIE&&!window.XMLHttpRequest; var isIE8=isIE& ...

  5. 海康威视频监控设备Web查看系统(二):服务器篇

    声明:本系列文章只提供交流与学习使用.文章中所有涉及到海康威视设备的SDK均可在海康威视官方网站下载得到.文章中所有除官方SDK意外的代码均可随意使用,任何涉及到海康威视公司利益的非正常使用由使用者自 ...

  6. git初学【常用命令、上传项目到码云或从码云拉取、克隆项目】

    1.下载git.https://git-scm.com/   注册码云:https://gitee.com/2.安装git:  默认安装即可:  安装完成之后打开git bash进行最后一步配置  输 ...

  7. Tido 习题-二叉树-最高分

    题目描述 老师想知道从某某同学到某某同学当中,分数最高的是多少.现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入 输入包含多组测试数据.每组输入第一行是两个正整数N和M(0& ...

  8. Laravel --- 要点笔记

    一.路由: // 常规用法 Route::get('/',function(){ return 'get'; }) // 匹配多个 Route::match(['get','post'],'/',fu ...

  9. MySQL解决存入数据库和取出数据库时间格式问题

    我们在往数据库里存数据时,时间格式正是我们想要的,然而取数据时去出现了这种情况 这明显不是我们想要的! 解决办法: 在我们配置mysql时添加一行代码: timezone:"08:00&qu ...

  10. 编解码器之战:AV1、HEVC、VP9和VVC

    视频Codec专家Jan Ozer在Streaming Media West上主持了一场开放论坛,邀请百余名观众参与热门Codec的各项优势与短板.本文整理了讨论的主要成果,基本代表了AV1.HEVC ...