题意:

      给你一个地图,让你从起点走到终点,然后图上有空地,墙,还有摄像头,摄像头有初始方向,每一秒摄像头都会顺时针旋转90度,每个摄像头有自己的观察范围,它所在的点,和当前它面向的那个点,如果我们当前这一步,和要走的下一步中有一个在当前这个时刻被摄像头监视着,那么我们就必须穿上个东西,穿上这个东西之后就可以不被发现了,但是穿上这个东西后移动速度变成每个格子3秒了,或者我们可以选择当前这一步静止不动。

思路:

      wa了20多次,哎!,对于每一个点最多可以等两次(有的人说3次),其实就是两次,因为等两次之后最快的方式是+1走到下个点,等于直接用3的那个速度直接走过去,我们开一个数组mark[x][y][w] ,表示的是点x,y等待w次时的最优值,然后开个优先队列(保证第一个出来的答案就是最优的,同时也可以优化时间),然后当前点被监视,或者下一个点被监视的时候,我们就可以原地等待一次。具体看代码。


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4.  
  5. #define N 510

  6. using namespace std;
  7. typedef struct NODE
  8. {
  9. int x ,y ,t ,w;
  10. friend bool operator < (NODE a ,NODE b)
  11. {
  12. return a.t > b.t;
  13. }
  14. }NODE;
  15.  
  16. NODE xin ,tou;
  17. int mark[N][N][5];
  18. int map[N][N] ,ex ,ey ,n;
  19. int dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};
  20. bool ok(int x ,int y)
  21. {
  22. return x >= 1 && x <= n && y >= 1 && y <= n && map[x][y];
  23. }
  24. int sxj(int x ,int y ,int t)
  25. {
  26. if(map[x][y] >= 1 && map[x][y] <= 4) return 1;
  27. if(x - 1 >= 1 && map[x-1][y] >= 1 && map[x-1][y] <= 4)
  28. {
  29. int now = (map[x-1][y] + t) % 4;
  30. if(!now) now = 4;
  31. if(now == 3) return 1;
  32. }
  33. if(x + 1 <= n && map[x+1][y] >= 1 && map[x+1][y] <= 4)
  34. {
  35. int now = (map[x+1][y] + t) % 4;
  36. if(!now) now = 4;
  37. if(now == 1) return 1;
  38. }
  39. if(y - 1 >= 1 && map[x][y-1] >= 1 && map[x][y-1] <= 4)
  40. {
  41. int now = (map[x][y-1] + t) % 4;
  42. if(!now) now = 4;
  43. if(now == 2) return 1;
  44. }
  45. if(y + 1 <= n && map[x][y+1] >= 1 && map[x][y+1] <= 4)
  46. {
  47. int now = (map[x][y+1] + t) % 4;
  48. if(!now) now = 4;
  49. if(now == 4) return 1;
  50. }
  51. return 0;
  52. }
  53. int BFS(int x ,int y)
  54. {
  55. priority_queue<NODE>q;
  56. xin.x = x ,xin.y = y ,xin.t = xin.w = 0;
  57. for(int i = 1 ;i <= n ;i ++)
  58. for(int j = 1 ;j <= n ;j ++)
  59. for(int k = 0 ;k <= 4 ;k ++)
  60. mark[i][j][k] = 100000000;
  61. mark[xin.x][xin.y][xin.w] = 0;
  62. q.push(xin);
  63. while(!q.empty())
  64. {
  65. tou = q.top();
  66. q.pop();
  67. if(tou.x == ex && tou.y == ey) return tou.t;
  68. for(int i = 0 ;i < 4 ;i ++)
  69. {
  70. xin.x = tou.x + dir[i][0];
  71. xin.y = tou.y + dir[i][1];
  72. xin.w = 0;
  73. if(!ok(xin.x ,xin.y)) continue;
  74. if(sxj(tou.x ,tou.y ,tou.t) || sxj(xin.x ,xin.y ,tou.t))
  75. xin.t = tou.t + 3;
  76. else xin.t = tou.t + 1;
  77. if(xin.t < mark[xin.x][xin.y][xin.w])
  78. {
  79. mark[xin.x][xin.y][xin.w] = xin.t;
  80. q.push(xin);
  81. }
  82. }
  83.  
  84. xin.x = tou.x ,xin.y = tou.y ;
  85. xin.t = tou.t + 1 ,xin.w = tou.w + 1;
  86. if(xin.w <= 2 && xin.t < mark[xin.x][xin.y][xin.w])
  87. {
  88. mark[xin.x][xin.y][xin.w] = xin.t;
  89. q.push(xin);
  90. }
  91. }
  92. return -1;
  93. }
  94. int main ()
  95. {
  96. int t ,i ,j ,x ,y ,cas = 1;
  97. char str[N];
  98. scanf("%d" ,&t);
  99. while(t--)
  100. {
  101. scanf("%d" ,&n);
  102. for(i = 1 ;i <= n ;i ++)
  103. {
  104. scanf("%s" ,str);
  105. for(j = 0 ;j < n ;j ++)
  106. {
  107. if(str[j] == '.') map[i][j+1] = 5;
  108. if(str[j] == '#') map[i][j+1] = 0;
  109. if(str[j] == 'N') map[i][j+1] = 1;
  110. if(str[j] == 'E') map[i][j+1] = 2;
  111. if(str[j] == 'S') map[i][j+1] = 3;
  112. if(str[j] == 'W') map[i][j+1] = 4;
  113. if(str[j] == 'M') map[i][j+1] = 5 ,x = i ,y = j + 1;
  114. if(str[j] == 'T') map[i][j+1] = 5 ,ex = i ,ey = j + 1;
  115. }
  116. }
  117. printf("Case #%d: %d\n" ,cas ++ ,BFS(x ,y));
  118. }
  119. return 0;
  120. }

hdu5040 不错的广搜的更多相关文章

  1. poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重

    挺不错的题目,很锻炼代码能力和调试能力~ 题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1. 由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向 ...

  2. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

  3. HDU 5652(二分+广搜)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/128683#problem/E 题目大意:给定一只含有0和1的地图,0代表可以走的格子,1代表不能走的格 子.之 ...

  4. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  5. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  6. poj 3278:Catch That Cow(简单一维广搜)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45648   Accepted: 14310 ...

  7. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  8. 广搜+打表 POJ 1426 Find The Multiple

    POJ 1426   Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25734   Ac ...

  9. 双向广搜 codevs 3060 抓住那头奶牛

    codevs 3060 抓住那头奶牛 USACO  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold   题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...

随机推荐

  1. JVM 中的StringTable

    是什么 字符串常量池是 JVM 中的一个重要结构,用于存储JVM运行时产生的字符串.在JDK7之前在方法区中,存储的是字符串常量.而字符串常量池在 JDK7 开始移入堆中,随之而来的是除了存储字符串常 ...

  2. 面试准备——计算机网络(https)

    一.为什么要提出HTTPS? HTTP的缺点: 明文通信.不加密,可能被窃听. 无身份验证,可能遭遇伪装. 无法证明报文的完整性,可能被篡改. 二.HTTPS = HTTP+加密(防窃听)+认证(防伪 ...

  3. 给出镜像FreeBSD 基本要求

    硬盘 ports 500G update 500G portsnap 500G pkg arm64 amd64 i386 11-12-13 4TB 网络流量一个月专线大概2w RMB CPU 内存 其 ...

  4. 痞子衡嵌入式:盘点国内车规级MCU厂商

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内车规级MCU厂商及其产品. 在汽车电子领域,MCU的应用非常广泛,大到车身控制与动力总成,小到雨刷车窗等控制单元,都离不开MCU的身 ...

  5. axios之增删查改操作

    一.get方法获取数据 axios.get('url') .then(function (res) { console.log(res); }).catch(function (error) { co ...

  6. 1x1卷据层的作用

    1. 尽管1x1的卷据不会捕捉空间特征(spatial features/patterns,直观点说就是2D平面图的纹理特征),但是他们能很好基于通道(channel-wise/along the d ...

  7. go中sync.Mutex源码解读

    互斥锁 前言 什么是sync.Mutex 分析下源码 Lock 位运算 Unlock 总结 参考 互斥锁 前言 本次的代码是基于go version go1.13.15 darwin/amd64 什么 ...

  8. python--requests模块详解

    GET请求 首先构造一个最简单的get请求,请求的链接为http://httpbin.org/get import requests 2 r = requests.get("http://h ...

  9. [Azure Devops] 使用 Azure Boards 管理工作

    1. 什么是 Azure Boards 通过 Azure Boards 网络服务,团队可以管理其软件项目.它提供了丰富的功能,包括 Scrum 和看板的本地支持.可定制的仪表板和集成报告.这些工具可以 ...

  10. 2,turicreate入门 - 一个简单的回归模型

    turicreate入门系列文章目录 1,turicreate入门 - jupyter & turicreate安装 2,turicreate入门 - 一个简单的回归模型 3,turicrea ...