题意:

      给你一个地图,让你从起点走到终点,然后图上有空地,墙,还有摄像头,摄像头有初始方向,每一秒摄像头都会顺时针旋转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. Image Super-Resolution via Sparse Representation——基于稀疏表示的超分辨率重建

    经典超分辨率重建论文,基于稀疏表示.下面首先介绍稀疏表示,然后介绍论文的基本思想和算法优化过程,最后使用python进行实验. 稀疏表示 稀疏表示是指,使用过完备字典中少量向量的线性组合来表示某个元素 ...

  2. 2020年12月-第01阶段-前端基础-认识WEB

    认识WEB 1.认识网页 网页主要由文字.图像和超链接等元素构成.当然,除了这些元素,网页中还可以包含音频.视频以及Flash等. 思考: 网页是如何形成的呢? 总结 网页有图片.链接.文字等元素组成 ...

  3. Picgo + Gitee +Typora(自动上传)搭建markdown免费图库

    Picgo + Gitee +Typora(自动上传)搭建markdown免费图库 前言: ​ 在写博客的是时候,之前那都是直接在博客网站上面写好了,再一一插入图片,当要在同时2个以上的博客上面发表的 ...

  4. 1.5 PHP基础+1.5.1 访问数据库

    PHP作为流行的网站开发语言,具有上手简单,运行速度快的特点,它和javascript类似,无需定义变量类型,免去了使用者要对变量类型转换的烦恼,当然了,这就要求我们要对变量类型隐式转换过程予以关注. ...

  5. C# 应用 - 封装类访问 Mysql 数据库

    个人经历的项目主要都是用 Postgresql 或 Oracle 数据库,本文非原创,从他处整理而来. 1. 库类 mysql.data.dll using MySql.Data.MySqlClien ...

  6. Java流程控制:三种基本结构

    顺序结构: Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行顺序结构是最简单的算法结构语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的, ...

  7. LZZY高级语言程序设计之169页**5.17

    import java.util.Scanner;public class MQ3 { public static void main(String[] args) { Scanner sc = ne ...

  8. linuxc语言图形化编程包含gtk/gtk.h编译总是报错找不到该文件的解决方法

    在编译时输入gcc file.c `pkg-config --libs --cflags gtk+-2.0` 注意`不是单引号,和--前均有一个字符 这样问题就结局啦

  9. ch1_5_1统计最大最小元素的平均比较次数

    public class ch1_5_1统计最大最小元素的平均比较次数 { public static void main(String[] args) { // TODO Auto-generate ...

  10. 使用命令行编译Qt程序

    code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...