Instrusive

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 596    Accepted Submission(s): 190

Problem Description
The legendary mercenary Solid Matt gets a classic mission: infiltrate a military base.

The military base can be seen as an N * N grid. Matt's target is in one of the grids and Matt is now in another grid.

In normal case, Matt can move from a grid to one of the four neighbor grids in a second. But this mission is not easy.

Around the military base there are fences, Matt can't get out of the base.

There are some grids filled with obstacles and Matt can't move into these grids.

There are also some surveillance cameras in the grids. Every camera is facing one of the four direction at first, but for every second, they will rotate 90 degree clockwisely. Every camera's sight range is 2, which means that if Matt is in the same grid as the camera, or in the grid that the camera is facing, he will be seen immediately and the mission will fail.

Matt has a special equipment to sneak: a cardbox. Matt can hide himself in the card box and move without being noticed. But In this situation, Matt will have to use 3 seconds to move 1 grid. Matt can also just hide in the cardbox without moving. The time to hide and the time to get out of the cardbox can be ignored.

Matt can't take the risk of being noticed, so he can't move without cardbox into a grid which is now insight of cameras or from a grid which is now insight of cameras. What's more, Matt may be in the cardbox at the beginning.

As a live legend, Matt wants to complete the mission in the shortest time.

 
Input
The first line of the input contains an integer T, denoting the number of testcases. Then T test cases follow.

For each test cases, the first line contains one integer:N(1<=N<=500)

In the following N lines, each line contains N characters, indicating the grids.

There will be the following characters:

● '.' for empty 
● '#' for obstacle 
● 'N' for camera facing north 
● 'W' for camera facing west 
● 'S' for camera facing south 
● 'E' for camera facing east 
● 'T' for target 
● 'M' for Matt

 
Output
For each test case, output one line "Case #x: y", where x is the case number (starting from 1) and y is the answer.

If Matt cannot complete the mission, output '-1'.

 
Sample Input
2
3
M..
.N.
..T
3
M..
###
..T
 
Sample Output
Case #1: 5
Case #2: -1
 
Source
 
 
题意:一张图,给出起点终点,障碍物以及摄像头,摄像头每秒钟转90度,求到达终点的最短时间。
思路:一开始想着建立500*500*4,用spfa,常数写搓果断TLE,后来改2m步后自动break,涉险400ms过关。后来发现×4的状态可以去掉,改完之后去掉break优化700ms。再改用优先队列,170ms。再改用各种方法,都没有能在170ms内跑完的。尽力了,不改了。下面贴代码。
 /*
* Author: Joshua
* Created Time: 2014年09月21日 星期日 14时19分18秒
* File Name: 1009.cpp
*/
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 520
#define inf 0x7f7f7f7f
typedef long long LL;
int T,n,sx,sy,ex,ey,kase;
char map[maxn][maxn];
int dir[][]={{-,},{,},{,},{,-}};
int ce[maxn][maxn];
int xm=;
int d[maxn*maxn];
bool f[maxn*maxn]; struct cmp
{
bool operator()(int a,int b)
{
return d[a]>d[b]; }
}; void init()
{
scanf("%d",&n); scanf ("\n");
for (int i=;i<n;++i)
memset(ce[i],-,*n);
for (int i=;i<n;++i)
{
scanf("%s",map[i]);
for (int j=;j<n;++j)
{
if (map[i][j]=='M') sx=i,sy=j,map[i][j]='.';
if (map[i][j]=='T') ex=i,ey=j,map[i][j]='.';
if (map[i][j]=='N') ce[i][j]=,map[i][j]='.';
if (map[i][j]=='E') ce[i][j]=,map[i][j]='.';
if (map[i][j]=='S') ce[i][j]=,map[i][j]='.';
if (map[i][j]=='W') ce[i][j]=,map[i][j]='.';
}
}
int temp;
if (n<=)
{
for (int i=;i<n;++i)
for (int j=;j<n;++j)
{
temp=(i<<)+j;
d[temp]=inf;
f[temp]=false;
}
}
else
{
memset(d,0x7f,sizeof(d));
memset(f,,sizeof(f));
}
} void update(int x,int y,int dir,priority_queue<int, vector<int>,cmp> &q)
{
int temp=(x<<)+y;
if (d[temp]>dir)
{
d[temp]=dir;
q.push(temp);
}
} inline int fabs(const int &x)
{
if (x< ) return -x;
return x;
} bool find(int tx,int ty,int tt )
{
int xx,yy;
if (~ce[tx][ty]) return true;
for (int i=;i<;++i)
{
xx=tx+dir[i][];
yy=ty+dir[i][];
if (xx< || xx>=n || yy< || xx>=n) continue;
if (!(~ce[xx][yy])) continue;
if ( fabs( ((ce[xx][yy]+tt)&)-i)==) return true;
}
return false;
} void solve()
{
int temp,tx,ty,tt,xx,yy,dis,end=(ex<<)+ey;
bool flag;
priority_queue<int,vector<int>,cmp> q;
update(sx,sy,,q);
while (!q.empty())
{
temp=q.top();
q.pop();
if (f[temp]) continue;
if (temp==end) break;
f[temp]=true;
tx=(temp>>)&xm;
ty=temp&xm;
dis=d[temp];
tt=dis&;
for (int i=;i<;++i)
{
flag=find(tx,ty,tt+i);
for (int l=;l<;++l)
{
xx=tx+dir[l][];
yy=ty+dir[l][];
if (xx< || xx>=n || yy< || yy>=n) continue;
if (map[xx][yy]=='#') continue;
if (flag || find(xx,yy,tt+i)) update(xx,yy,dis+i+,q);
else update(xx,yy,dis++i,q);
}
}
}
int ans=inf;
if (d[end]<ans)
ans=d[end];
if (ans==inf) ans=-;
printf("Case #%d: %d\n",kase,ans);
} int main()
{
scanf("%d",&T);
kase=;
while (T--)
{
kase++;
init();
solve();
}
return ;
}

hdu 5040 Instrusive的更多相关文章

  1. hdu 5040 Instrusive【BFS+优先队列】

    11733274 2014-09-26 12:42:31 Accepted 5040 62MS 1592K 4848 B G++ czy 先转一个优先队列的用法: http://www.cppblog ...

  2. HDU 5040 Instrusive(BFS+优先队列)

    题意比较啰嗦. 就是搜索加上一些特殊的条件,比如可以在原地不动,也就是在原地呆一秒,如果有监控也可以花3秒的时间走过去. 这种类型的题目还是比较常见的.以下代码b[i][j][x]表示格子i行j列在x ...

  3. 2014年北京网络赛 Instrusive HDU 5040 题解 优先队列

    网赛的时候看了这道题,发现就是平常的那种基础搜索题. 由于加了一个特殊条件:可以一次消耗3秒或原地停留1秒. 那就不能使用简单的队列了,需要使用优先队列才行. 题意 告诉一副地图:一个起点,一个终点, ...

  4. HDU 5040

    http://acm.hdu.edu.cn/showproblem.php?pid=5040 题意比较难懂,有摄像头的位置是可以走的,每回合开始看做人先走摄像头再转,也就是说如果你这回合走之前没有摄像 ...

  5. hdu 5040 BFS 多维化处理图

    http://acm.hdu.edu.cn/showproblem.php?pid=5040 跟这一题http://blog.csdn.net/u011026968/article/details/3 ...

  6. hdu 5040 bfs

    http://acm.hdu.edu.cn/showproblem.php?pid=5040 一个人拿着纸盒子往目的地走  正常情况下一秒走一格  可以原地不动躲在盒子里  也可以套着盒子三秒走一格 ...

  7. leetcode N-Queens/N-Queens II, backtracking, hdu 2553 count N-Queens, dfs 分类: leetcode hdoj 2015-07-09 02:07 102人阅读 评论(0) 收藏

    for the backtracking part, thanks to the video of stanford cs106b lecture 10 by Julie Zelenski for t ...

  8. HDU 1430 魔板(康托展开+BFS+预处理)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  9. HDU 1043 & POJ 1077 Eight(康托展开+BFS+预处理)

    Eight Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30176   Accepted: 13119   Special ...

随机推荐

  1. [权限相关]在PeopleSoft中查找可以使用DataMover的用户

    DataMover是一个功能非常强大的工具,它的访问权限应该被控制,特别是在PRD环境中.在每个公司,许多用户可能在一段时间内切换部门,角色和职责,所以每隔一段时间就应该检查这些用户的权限,以确认他们 ...

  2. nopCommerce 3.9 大波浪系列 之 路由注册

    在Global.asax,Application_Start()方法中会进行路由注册,代码如下. public static void RegisterRoutes(RouteCollection r ...

  3. 我的学习之路_第三十四章_jsp

    jsp 在只有servlet时,输出页面内容比较麻烦(成本高,java代码中输出HTML标签),所以需要一种技术,主要是HTML页面的代码(HTML,css,js),可以嵌入java代码,来实现动态页 ...

  4. 13. leetcode 453. Minimum Moves to Equal Array Elements

    Given a non-empty integer array of size n, find the minimum number of moves required to make all arr ...

  5. java8之lambda表达式(1)-基本语法

    lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) class Student{ private String name; private Double ...

  6. 两个List比较各自对象的属性相同的问题

    最近做checkbox默认勾选的时候,涉及到两个list直接比较彼此对象的Id属性是否相同的问题.能力有限,想到这个笨方法. 创建一个Bean: public class Bean { private ...

  7. openstack使用openvswitch实现vxlan组网

     openstack使用openvswitch实现vxlan openstack环境: 1 版本:ocata 2 系统:ubuntu16.04.2 3 控制节点 1个 + 计算节点 1个 4 控制节点 ...

  8. XML语法小结

    语法结构主要要求: (1)有且仅有一个根元素. 根元素也称文档元素,整个 XML 文档的其他元素都包含在根元素中,并通过嵌套形成树 型结构.除了根元素外,其他元素都是子元素. (2)每个元素必须有开始 ...

  9. 关于HTML应用中的实操细节

    在编写HTML程序时,初阶段在打编码时容易忽视语法方面的问题,如大小写,中英文切换标点等.正常在编码时出现语法问题自己很难发现,所以刚开始练习特别要注重语法方面的规范,另外在编码时要有规范的书写方式, ...

  10. 基于tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

    基于tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的人工智能技术的发展 ...