hdu5040 不错的广搜
题意:
给你一个地图,让你从起点走到终点,然后图上有空地,墙,还有摄像头,摄像头有初始方向,每一秒摄像头都会顺时针旋转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 不错的广搜的更多相关文章
- poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重
挺不错的题目,很锻炼代码能力和调试能力~ 题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1. 由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向 ...
- HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?
这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5652(二分+广搜)
题目链接:http://acm.hust.edu.cn/vjudge/contest/128683#problem/E 题目大意:给定一只含有0和1的地图,0代表可以走的格子,1代表不能走的格 子.之 ...
- nyoj 613 免费馅饼 广搜
免费馅饼 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...
- poj 3984:迷宫问题(广搜,入门题)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7635 Accepted: 4474 Description ...
- poj 3278:Catch That Cow(简单一维广搜)
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 45648 Accepted: 14310 ...
- 双向广搜 POJ 3126 Prime Path
POJ 3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16204 Accepted ...
- 广搜+打表 POJ 1426 Find The Multiple
POJ 1426 Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25734 Ac ...
- 双向广搜 codevs 3060 抓住那头奶牛
codevs 3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...
随机推荐
- 该死的端口占用!教你用 Shell 脚本一键干掉它!
1. 前言 大家好,我是安果! 在 Web 开发中,经常会遇到「端口被占用」的场景 常规解决方案是: 使用 lsof -i 命令查询占用端口的进程 PID 利用 kill -9 PID 干掉目标进程 ...
- Java 面向对象 04
面向对象·四级 多态的概述及其代码实现 * A:多态(polymorphic)概述 * 事物存在的多种形态 * B:多态前提 * a:要有继承关系 * b:要有方法重写 * c: 要有父类引用指向子类 ...
- 【Arduino学习笔记05】Arduino数字输入、输出和脉冲宽带调制 -- 小项目:彩色小台灯
基本功能: 长按控制按钮开机,长按控制按钮关机(>3s) 通过三个调节按钮调节灯的颜色,每一个按钮分别对应R,G,B值 模式切换:短按控制按钮切换模式(长亮模式/闪烁模式) 元器件清单: Ard ...
- 设计模式之抽象工厂模式(Abstract Factory Pattern)
一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...
- mongodb 聚合(aggregate)
MongoDB中文手册|官方文档中文版 https://docs.mongoing.com/ 聚合操作处理数据记录和 return 计算结果.聚合操作将来自多个文档的值组合在一起,并且可以对分组数 ...
- FreeBSD 的xfce 终端动态标题不显示问题解决了:
tcsh配置,home目录创建.tcshrc, 写入以下配置 alias h history 25 alias j jobs -l alias la ls -aF alias lf ls -FA al ...
- FreeBSD NGINX TCP转发
前几天搞转发,研究了下TCP转发,现在记录下来 首先加载模块 注意:这是FreeBSD的位置.并且需要NGINX支持 load_module /usr/local/libexec/nginx/ngx_ ...
- Vulkan移植GpuImage(一)高斯模糊与自适应阈值
自适应阈值效果图 demo 这几天抽空看了下GpuImage的filter,移植了高斯模糊与自适应阈值的vulkan compute shader实现,一个是基本的图像处理,一个是组合基础图像处理聚合 ...
- VMware 虚拟机安装(使用CentOS镜像)
(1)启动虚拟机,点击"文件"-->"新建虚拟机",选择安装类型,推荐"典型". (2)选择稍后安装操作系统 ...
- 如何使用Typora写博客
如何写博客及Typora的使用 Typora Typora是写好博客的一个重要的软件,下面我们来介绍如何安装以及使用它 安装 官网下载Typora 较慢,首先附上Typora安装包: 链接:https ...