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

思路:

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


#include<stdio.h>
#include<string.h>
#include<queue>#define N 510

using namespace std;typedef struct NODE
{int x ,y ,t ,w;friend bool operator < (NODE a ,NODE b){return a.t > b.t;}
}NODE;NODE xin ,tou;
int mark[N][N][5];
int  map[N][N] ,ex ,ey ,n;
int  dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};bool ok(int x ,int y)
{return x >= 1 && x <= n && y >= 1 && y <= n && map[x][y];
}int sxj(int x ,int y ,int t)
{if(map[x][y] >= 1 && map[x][y] <= 4) return 1;if(x - 1 >= 1 && map[x-1][y] >= 1 && map[x-1][y] <= 4){int now = (map[x-1][y] + t) % 4;if(!now) now = 4;if(now == 3) return 1;}if(x + 1 <= n && map[x+1][y] >= 1 && map[x+1][y] <= 4){int now = (map[x+1][y] + t) % 4;if(!now) now = 4;if(now == 1) return 1;}if(y - 1 >= 1 && map[x][y-1] >= 1 && map[x][y-1] <= 4){int now = (map[x][y-1] + t) % 4;if(!now) now = 4;if(now == 2) return 1;}if(y + 1 <= n && map[x][y+1] >= 1 && map[x][y+1] <= 4){int now = (map[x][y+1] + t) % 4;if(!now) now = 4;if(now == 4) return 1;}return 0;
}int BFS(int x ,int y)
{priority_queue<NODE>q;xin.x = x ,xin.y = y ,xin.t = xin.w = 0;for(int i = 1 ;i <= n ;i ++)for(int j = 1 ;j <= n ;j ++)for(int k = 0 ;k <= 4 ;k ++)mark[i][j][k] = 100000000;mark[xin.x][xin.y][xin.w] = 0;q.push(xin);while(!q.empty()){tou = q.top();q.pop();if(tou.x == ex && tou.y == ey) return tou.t;for(int i = 0 ;i < 4 ;i ++){xin.x = tou.x + dir[i][0];xin.y = tou.y + dir[i][1];xin.w = 0;if(!ok(xin.x ,xin.y)) continue; if(sxj(tou.x ,tou.y ,tou.t) || sxj(xin.x ,xin.y ,tou.t))xin.t = tou.t + 3;else xin.t = tou.t + 1;if(xin.t < mark[xin.x][xin.y][xin.w]){mark[xin.x][xin.y][xin.w] = xin.t;q.push(xin);}}xin.x = tou.x ,xin.y = tou.y ;xin.t = tou.t + 1 ,xin.w = tou.w + 1;if(xin.w <= 2 && xin.t < mark[xin.x][xin.y][xin.w]){mark[xin.x][xin.y][xin.w] = xin.t;q.push(xin);}}return -1;
}int main ()
{int t ,i ,j ,x ,y ,cas = 1;char str[N];scanf("%d" ,&t);while(t--){scanf("%d" ,&n);for(i = 1 ;i <= n ;i ++){scanf("%s" ,str);for(j = 0 ;j < n ;j ++){if(str[j] == '.') map[i][j+1] = 5;if(str[j] == '#') map[i][j+1] = 0;if(str[j] == 'N') map[i][j+1] = 1;if(str[j] == 'E') map[i][j+1] = 2;if(str[j] == 'S') map[i][j+1] = 3;if(str[j] == 'W') map[i][j+1] = 4;if(str[j] == 'M') map[i][j+1] = 5 ,x = i ,y = j + 1;if(str[j] == 'T') map[i][j+1] = 5 ,ex = i ,ey = j + 1;}}printf("Case #%d: %d\n" ,cas ++ ,BFS(x ,y));}return 0;
}

hdu5040 不错的广搜旋转的摄像头相关推荐

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

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

  2. 广搜之原神·稻妻·荒海水位解谜中的两处机关 输入数字生成解谜步骤

    把稻妻的任务堆了很久,这两天才想起来肝一肝.不肝不知道,稻妻有这么大地图!怪不得2.0游戏资源足有20个G. 在神樱大祓(fu,二声)任务里,第二个场景是荒海,解谜过程中遇到两个雷方块机关,就是下面这 ...

  3. 多源BFS-双端队列广搜

    多源BFS AcWing173. 矩阵距离 给定一个N行M列的01矩阵A,A[i][j]A[i][j]A[i][j] 与 A[k][l]A[k][l]A[k][l] 之间的曼哈顿距离定义为: dist ...

  4. 算法学习 (门徒计划)3-3 深搜(DFS)与广搜(BFS)及经典问题 学习笔记

    算法学习 (门徒计划)3-3 深搜(DFS)与广搜(BFS)及经典问题 学习笔记 前言 深搜与广搜 搜索的核心概念 问题求解树 搜索剪枝和优化 问题求解树的状态 对比深搜与广搜 DFS-深度(deep ...

  5. 【C++广搜,队列】奇怪的电梯

    前言 题目洛谷P1135.我有参考洛谷上的题解 在此膜拜一下洛谷上的各位大神! 如果有疏漏.不足之处,欢迎指正. 题目 问题 A: 奇怪的电梯 时间限制: 1 Sec  内存限制: 128 MB 题目 ...

  6. Go 分布式学习利器(15) -- Go 实现 深搜和广搜

    强化语法,回顾算法. 通过Go语言实现 深度优先搜索 和 广度优先搜索,来查找社交网络中的三度好友关系(三度指的是一个节点到 其相邻节点 到 其相邻节点的节点 ,图递增三层好友关系). 涉及到的Go语 ...

  7. 搜索:广搜 词语阶梯

    问题描述以及解决过程如下导图 广搜实现如下 #include <iostream> #include <algorithm> #include <vector> # ...

  8. [NC23486]小A与小B 双向广搜

    题解:这个题属于走迷宫类型问题的一个升级版吧,不同之处在于一秒钟小A走一步,小B可以走两步,这两种事件是同时发生的,所以我们每秒钟让A扩散一步,让B扩散两步. 两个人走过的路径分别用 visited[ ...

  9. 【图论专题】BFS中的双向广搜 和 A-star

    双向广搜 AcWing 190. 字串变换 #include <cstring> #include <iostream> #include <algorithm> ...

最新文章

  1. 在Visual C++ 中使用内联汇编
  2. Win8Metro(C#)数字图像处理--2.12Sobel边缘检测
  3. Gauss-Newton算法学习
  4. [Leetcode] Permutations 全排列
  5. 在.Net环境下使用elasticsearch实现大数据量的搜索
  6. 特斯拉在华招聘太阳能和储能项目经理 屋顶光伏业务要来了?
  7. 金属拉链滑块行业调研报告 - 市场现状分析与发展前景预测
  8. 《数学之美》—PageRank
  9. ## python爬取MM131整站图片到本地
  10. CAJViewer安装报错卸载报错打开报错解决流程
  11. H5标签input标签上传文件(一)
  12. IMAP常用命令汇总
  13. leetcode 347
  14. 电热毯UL964测试申请要求有哪些呢
  15. 数字拼音翻译成阿拉伯数字
  16. 宝塔php缓存关闭,宝塔面板定期释放PHP占用内存
  17. DHCP的工作原理及过程
  18. 常用git命令总结大全
  19. python多子图坐标轴共享
  20. 漫画解读:车规芯片为何比普通芯片贵?跟普通芯片有什么差异?

热门文章

  1. 第4章 类型基础 -- 4.1 所有类型都从System.Object派生
  2. My Site Cleanup Job
  3. Tokyo Tyrant(TTServer)系列(三)-Memcache协议
  4. 站长图卦:每天坚持搬砖 定有美好明天
  5. git常用命名行总结
  6. 洛谷4366——最短路(dijkstra,思维,异或)
  7. [bzoj2893] 集合计数
  8. 使用postman模拟登录请求
  9. Arduino学习笔记35
  10. C# .NET MVC 基础提供程序在 Open 上失败