http://acm.hdu.edu.cn/showproblem.php?pid=5040

跟这一题http://blog.csdn.net/u011026968/article/details/39586669

算是异曲同工。

所以比較easy想到了vis[4][MAXN][MAXN] 表示监控摄像头转4个方向

那个3秒跟蛇也非常像,但是处理起来还有点麻烦。參考了这里:

http://blog.csdn.net/hongrock/article/details/39472269

写的真不错:

方法:

dir数组就是依照顺时针方式的四个方向

den[4][MAXN][MAXN]处理出来图上各个时间是否须要延迟3秒

假设如今所在位置或者下一个位置在受监控区,就须要3秒

只是略蛋疼的是,那个3秒,假设如今在受监控区,下一秒就不在了,还是须要3秒。这个题目的离散时间跟现实连续时间有差异感觉好怪

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const int MAXN = 500+30; struct Node{
int x,y,t;
Node(){}
Node(int x, int y, int t):x(x),y(y),t(t){}
bool operator < (const Node & tm)const{
return t>tm.t;
}
}; int mx,my,n;
char mat[MAXN][MAXN];
int vis[4][MAXN][MAXN], den[4][MAXN][MAXN];
int dir[4][2]={ {-1,0},{0,1},{1,0},{0,-1}}; inline int alp(char c)
{
if(c == 'N')return 0;
if(c == 'S')return 2;
if(c == 'W')return 3;
if(c == 'E')return 1;
return -1;
} inline int legal(int x, int y)
{
if(x>=0 && y>=0 && x<n && y<n && mat[x][y]!='#')
return 1;
return 0;
} int bfs()
{
priority_queue<Node>q;
CL(vis,0);
q.push(Node(mx,my,0));
while(!q.empty())
{
Node tmp=q.top();
q.pop();
if(vis[tmp.t%4][tmp.x][tmp.y])continue;
if(mat[tmp.x][tmp.y] == 'T')return tmp.t; vis[tmp.t%4][tmp.x][tmp.y]=1;
q.push(Node(tmp.x,tmp.y,tmp.t+1));
for(int i=0;i<4;i++)
{
int x=tmp.x+dir[i][0];
int y=tmp.y+dir[i][1];
if(!legal(x,y))continue;
int tmpt=tmp.t;
if(den[tmp.t%4][x][y] || den[tmp.t%4][tmp.x][tmp.y])tmpt+=3;
else tmpt++;
if(!vis[tmpt%4][x][y])q.push(Node(x,y,tmpt));
}
}
return -1;
} int main()
{
//IN("hdu5040.txt");
int ncase,ic=0;
scanf("%d",&ncase);
while(ncase--)
{
CL(den,0);
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",mat[i]);
for(int j=0;j<n;j++)
{
if(mat[i][j] == 'M'){mx=i;my=j;}
else
{
int al=alp(mat[i][j]);
if(~al)//al==-1的时候,此处推断条件才是0
{
for(int k=0;k<4;k++)
{
den[k][i][j]=1;// N S E W
int x=i+dir[(al+k)%4][0];
int y=j+dir[(al+k)%4][1];
if(x>=0 && y>=0 && x<n && y<n)den[k][x][y]=1;
}
}
}
}
//getchar();
}
printf("Case #%d: %d\n", ++ic, bfs());
}
return 0;
}

hdu 5040 BFS 多维化处理图的更多相关文章

  1. hdu 5040 bfs

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

  2. hdu 5517 Triple(二维树状数组)

    Triple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  3. hdu 4531 bfs(略难)

    题目链接:点我 第一次不太清楚怎么判重,现在懂了,等下次再做 /* *HDU 4531 *BFS *注意判重 */ #include <stdio.h> #include <stri ...

  4. WebGl 二维纹理贴图(矩形)

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

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

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

  6. Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph)

    Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree ...

  7. HDU 1429 (BFS+记忆化状压搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1429 题目大意:最短时间内出迷宫,可以走回头路,迷宫内有不同的门,对应不同的钥匙. 解题思路: 要是 ...

  8. HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)

    题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...

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

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

随机推荐

  1. OpenCV学习 2:播放AVI视频

    原创文章,欢迎转载,转载请注明出处 第二个程序,播放视频.用opencv做起来是如此的简单..哈哈.           学Opencv,只是为了在它的基础上实现工程应用,而它里面高深的理论我等屌丝只 ...

  2. 【转】 UIButton上使用UIEdgeInsetsMaketitle跟图片对齐

    [转]http://blog.csdn.net/yanxiaoqing/article/details/7230660 默认情况下,不设置的效果,都使居中现实,button为150*150 使用以下设 ...

  3. FAQ:Python中*args和**agrs的区别

    python提供了两种特别的方法来定义函数的参数: 1. 位置参数 *args,  把参数收集到一个元组中,作为变量args   >>>def show_args(*args):   ...

  4. 要不要用STL的问题——真理是越辩越明的~

    QtWidgets的维护者 Marc Mutz 有一篇博客比较详尽的介绍了 Qt自己的容器.介绍了何时用什么比较好https://marcmutz.wordpress.com/effective-qt ...

  5. Referrer 还是 Referer?

    上回我写了一篇文章介绍「Referrer Policy」,有小伙伴看完后问我:Referrer 这个单词到底怎么拼,为什么有时候中间有两个 r,有时候只有一个? 是的,这是一个很有趣的问题,这里就给有 ...

  6. android:configChanges 屏幕横竖屏切换

    出处:http://blog.csdn.net/djy1992/article/details/9378195 --->  android:screenOrientation="por ...

  7. MVVMLight Toolkit在Windows Phone中的使用扩展之一:在ViewModel中实现导航,并传递参数

    MVVMLight是MVVM开发模式在Windows Phone平台下的一个开发框架,关于MVVMLight的基础使用,已经有人写的很好了,可以参照:MVVM.MVVMLight.MVVMLight ...

  8. javaScript 工作必知(七) 对象继承

    对象继承inherit var o = { r: 1 }; var c = function f() { }; c.prototype = o; c.r = 3; alert(o.r);//被继承的属 ...

  9. oracle数据库获取指定表的列的相关信息

    1.很多时候我们需要从数据库中获取指定表的所有列的相关属性,如 name,commens,datatype,datalength,pk等.下面就是制定的语句. select c.TABLE_NAME ...

  10. Android基础知识巩固:关于PendingIntent和广播

    平时使用广播的场合比较多,但细节的东西,看过了也没有总结,以至于某些场合有小问题,还是要把原理和属性搞清楚才能运用自如. 其实也是自己比较懒,先看别人的blog,有个概念再去官网看英文的能好理解一些. ...