Problem H

Problem Description

小边为了寻找梦寐以求的骨头误入一个迷宫,它灵敏的嗅觉告诉它,在迷宫中的某一处有一块完美的骨头.
由于迷宫会在一段时间后关闭,所以小边必须在一定时间找到那块骨头,这样才能有充足的时间来带着骨头离开.
小边在迷宫中可以从当前位置走到相邻的位置,每次移动消耗单位时间,当然,因为小边对骨头的无比执着,它偶尔会使出绝技”狗急跳墙”(一次移动两个单位位置,同样消耗单位时间).使用这个技能的时候,可以翻过一面单位厚度的墙(即第一步移动可以踩在墙上,当然也可以不踩).
hint:使用技能的时候,不用管中间那一步是否可走。
那么小边能够如愿以偿的找到骨头并离开迷宫么?

Input

多组输入
每组输入第一行是四个数m,n(0<m,n<=30),k(0<=k<=30),t(0<=t<=100),分别代表迷宫的长,宽,小边使用”狗急跳墙”的最大次数以及找到骨头的时间限制.
m=n=k=t=0代表输入结束
接下的m行每行有n个字符,‘.’代表地面,’#’代表墙,’@’代表目前小边所处的位置,’X’代表骨头所在的位置

Output

若小边能在规定时间内找到骨头,则输出Yes,否则输出No.
每个输出占一行.

Sample Input

  1. 3 3 1 2
  2. @##
  3. #.#
  4. #X#
  5. 4 4 1 3
  6. @.#.
  7. #.##
  8. ####
  9. ##X.
  10. 0 0 0 0

Sample Output

  1. Yes
  2. No
  3.  
  4. 这题把我搞死了。
    其实直接大力搜就好了,唯一要注意的地方就是:当前走到的位置,如果剩下的使用技能的次数大于曾经走到这里的次数,那么更新。
    当然,这里没走到过,也需要更新。
    这样,更新次数就不超过30*30*30次(当然事实上远小于这个数量)
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define REP(i,n) for(int i(0); i < (n); ++i)
  6. #define rep(i,a,b) for(int i(a); i <= (b); ++i)
  7. #define dec(i,a,b) for(int i(a); i >= (b); --i)
  8. #define for_edge(i,x) for(int i = H[x]; i; i = X[i])
  9.  
  10. const int N = + ;
  11. const int M = + ;
  12. const int Q = + ;
  13. const int A = + ;
  14.  
  15. const int dx[] = {, , , -};
  16. const int dy[] = {, , -, };
  17.  
  18. const int cx[] = {, , -, , , -, , -};
  19. const int cy[] = {, , , -, , -, -, };
  20.  
  21. struct node{
  22. int x, y, k, t;
  23. } st, en;
  24.  
  25. char s[Q];
  26. int n, m, k, t;
  27. int a[A][A];
  28. queue <node> q;
  29. int f[A][A];
  30.  
  31. bool check(int x, int y){
  32. return (x >= ) && (x <= m) && (y >= ) && (y <= n);
  33. }
  34.  
  35. int main(){
  36.  
  37. while (~scanf("%d%d%d%d", &m, &n, &k, &t), n + m + k + t){
  38. memset(a, , sizeof a);
  39. rep(i, , m){
  40. scanf("%s", s + );
  41. rep(j, , n){
  42. if (s[j] == '#'){
  43. a[i][j] = ;
  44. }
  45. else{
  46. a[i][j] = ;
  47. if (s[j] == '@') st.x = i, st.y = j;
  48. if (s[j] == 'X') en.x = i, en.y = j;
  49. }
  50. }
  51.  
  52. }
  53. while (!q.empty()) q.pop();
  54. st.k = k;
  55. st.t = t;
  56. q.push(st);
  57. memset(f, -, sizeof f);
  58. f[st.x][st.y] = k;
  59. int ans = ;
  60. while (!q.empty()){
  61. node now = q.front(); q.pop();
  62. if (now.x == en.x && now.y == en.y && now.t >= ){
  63. ans = ;
  64. break;
  65. }
  66. REP(i, ){
  67. node nn;
  68. nn.x = now.x + dx[i];
  69. nn.y = now.y + dy[i];
  70. if (check(nn.x, nn.y) && f[nn.x][nn.y] < now.k && !a[nn.x][nn.y]){
  71. nn.k = now.k;
  72. nn.t = now.t - ;
  73. if (nn.t >= ){
  74. q.push(nn);
  75. f[nn.x][nn.y] = nn.k;
  76. }
  77. }
  78. }
  79. if (now.k > ){
  80. REP(i, ){
  81. node nn;
  82. nn.x = now.x + cx[i];
  83. nn.y = now.y + cy[i];
  84. if (check(nn.x, nn.y) && f[nn.x][nn.y] < now.k - && !a[nn.x][nn.y]){
  85. nn.k = now.k - ;
  86. nn.t = now.t - ;
  87. if (nn.t >= ){
  88. q.push(nn);
  89. f[nn.x][nn.y] = nn.k;
  90. }
  91. }
  92. }
  93. }
  94. }
  95. if (ans) puts("Yes"); else puts("No");
  96. }
  97. return ;
  98.  
  99. }
  1.   

HDU-ACM“菜鸟先飞”冬训系列赛——第7场 H的更多相关文章

  1. HDU-ACM“菜鸟先飞”冬训系列赛——第10场

    Problem A 题意 给出l(房子宽度),d(pole距离房子的垂直距离),s(绳子长度),求可覆盖的面积 分析 一共四种情况 \[1.s<=d\] \[2.s<=sqrt(d*d+l ...

  2. HDU-ACM“菜鸟先飞”冬训系列赛——第9场

    Problem A 题意 一对兔子每月生一对兔子,兔子在\(m\)月后成熟,问\(d\)月后有多少兔子 分析 可以发现,第i月的兔子数量取决于第i-1月与i-m月,故 \(a[i]=a[i-1]+a[ ...

  3. HDU-ACM“菜鸟先飞”冬训系列赛——第8场(1004)

    Problem D Time Limit : 3000/3000ms (Java/Other) Memory Limit : 65535/102400K (Java/Other) Problem De ...

  4. HDU 4868 Information Extraction(2014 多校联合第一场 H)

    看到这道题时我的内心是奔溃的,没有了解过HTML,只能靠窝的渣渣英语一点一点翻译啊TT. Information Extraction 题意:(纯手工翻译,有些用词可能在html中不是一样的,还多包涵 ...

  5. hdu acm 1028 数字拆分Ignatius and the Princess III

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  6. Entity Framework菜鸟初飞

    Entity Framework菜鸟初飞 http://blog.csdn.net/zezhi821/article/details/7235134

  7. hdu 5418 (Floyd+哈密顿) 飞向世界

    http://acm.hdu.edu.cn/showproblem.php?pid=5418 题目大意是城市的编号是1到n,给出m条路线,表示从a城市飞到b城市飞机要耗多少油,最后问飞机从1出发飞过所 ...

  8. hdu acm 1166 敌兵布阵 (线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. hdu acm 2082 找单词

    找单词 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. [NOIP2012]疫情控制(二分答案+倍增+贪心)

    Description H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 ...

  2. 3 ways of including JavaScript in HTML

    Code written in JavaScript must be executed from a document written in HTML. There are three ways of ...

  3. C#+VisionPro连接相机获取图像的两种方式

    两种比较常用的方式. C#直接连接相机获取图像(GIGE) 在获取图像前,需要先创建一个相机对象,再使用这个相机对象的Acquire方法拍摄照片. ICogAcqFifo macqfifo;//定义相 ...

  4. day10 消息队列,多进程和多线程以及协程,异步IO,事件驱动等

    回顾一下线程和进程 线程与进程的区别 守护线程: 队列: 两种方式: 先进先出  # 后入先出   #卖水果,后来的来的是新的 生产者消费者模型: 生产包子, 吃包子 事件 event: 红绿灯模型 ...

  5. cf979d Kuro and GCD and XOR and SUM

    set做法 正解是trie-- 主要是要学会 \(a\ \mathrm{xor}\ b \leq a+b\) 这种操作 #include <iostream> #include <c ...

  6. IOS开发学习笔记011-xcode使用技巧

    xcode使用技巧 1.自动生成类 2.断点调试 3.代码段保存 4.注释标记 1.新建类,自动生成两个文件和基本结构 第一步  第二步,选择新建一个类,而不是一个源文件  第三步,书写类名一级自己要 ...

  7. IOS开发学习笔记010-面向对象的三大特性

    面向对象的三大特性 1.封装 2.继承 3.多态 一.封装 将类内部的属性保护起来,在外部不能直接访问,那么如果需要访问怎么办呢? OC提供了set方法来对成员变量进行访问 set方法 1.作用:提供 ...

  8. php 实现栈与队列

    <?php class queueOp{ /* * 队尾入队 * Return:处理之后队列的元素个数 */ public function tailEnquque($arr,$val){ re ...

  9. ubuntu16.04中docker安装curl拒绝连接问题

    在Ubuntu16.04中安装docker ce,安装步骤按照官网说明https://docs.docker.com/engine/installation/linux/docker-ce/ubunt ...

  10. 实用拜占庭容错算法PBFT

    实用拜占庭容错算法PBFT 实用拜占庭容错算法PBFT 96 乔延宏 2017.06.19 22:58* 字数 1699 阅读 4972评论 0喜欢 11 分布式架构遭遇的问题 分布式架构会遭遇到以下 ...