题意:

      给你一个地图,让你从起点走到终点,然后图上有空地,墙,还有摄像头,摄像头有初始方向,每一秒摄像头都会顺时针旋转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. 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. 剑指 Offer 14- II. 剪绳子 II + 贪心 + 数论 + 快速幂

    剑指 Offer 14- II. 剪绳子 II 题目链接 因为有取模的操作,动态规划中max不能用了,我们观察:正整数从1开始,但是1不能拆分成两个正整数之和,所以不能当输入. 2只能拆成 1+1,所 ...

  2. Mybatis系列全解(二):Mybatis简介与环境搭建

    封面:洛小汐 作者:潘潘 Mybatis 是一套持久层框架,灵活易用,特别流行. 前言 Mybatis系列全解,我们预计准备10+篇文章,让我们了解到 Mybatis 的基本全貌,真正从入门到上手,从 ...

  3. 手工实现一个ThreadPoolExecutor

    以下代码的实现逻辑出自于公众号 码农翻身 <你管这破玩意叫线程池?> - PS:刘欣老师在我心中是软件技术行业的大刘. 线程池接口 public interface Executor { ...

  4. 2020年HTML5考试模拟题整理(一)

    1.哪个元素被称为媒体元素的子元素? 答案:<track>. <track> 标签为媒体元素(比如 <audio> and <video>)规定外部文本 ...

  5. ThinkAdmin v6 未授权列目录/任意文件读取复现

    大佬的审计文章:https://github.com/zoujingli/ThinkAdmin/issues/244 任意文件读取 POC curl http://127.0.0.1/admin.ht ...

  6. Go语言学习 学习资料汇总

    从进入实验室以来,一直听小溪师兄说Go语言,但是第一学期的课很多,一直没有时间学习,现在终于空出来时间学习,按照我的学习习惯,我一般分为三步走 学习一门语言首先要知道学会了能干什么, 然后再把网上的资 ...

  7. 汇编 JCC指令表

    JCC指令 中文含义 英文原意 检查符号位 典型c应用 JZ/JE 若为0则跳转:若相等则跳转 jump if zero;jump if equal ZF=1 if (i == j);if (i == ...

  8. Jaeger Client Go 链路追踪|入门详解

    目录 从何说起 Jaeger 部署 Jaeger 从示例了解 Jaeger Client Go 了解 trace.span tracer 配置 Sampler 配置 Reporter 配置 分布式系统 ...

  9. go中semaphore(信号量)源码解读

    运行时信号量机制 semaphore 前言 作用是什么 几个主要的方法 如何实现 sudog 缓存 acquireSudog releaseSudog semaphore poll_runtime_S ...

  10. 运维趋势2019年总结,运维就是要做到"技多不压身"

    2019年 在互联网这个行业中对运维的要求越来越来越高,比如2015.16年的时候,运维只是做一些人力投入的事情,比如重启个服务,搭建一个nginx,mysql主从服务,简单的优化一下,就可以上线了, ...