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. 图的邻接链表实现(c)

    参考:算法:C语言实现 一书 实现: #ifndef GRAPH #define GRAPH #include<stdio.h> #include<stdlib.h> stru ...

  2. 关于调用约定(cdecl、fastcall、、thiscall) 的一点知识(用汇编来解释)good

    函数调用规范   当高级语言函数被编译成机器码时,有一个问题就必须解决:因为CPU没有办法知道一个函数调用需要多少个.什么样的参数.即计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者 ...

  3. isequal 和startswith 使用

    如果要把不同服务器发送过来的日志保存到不同的文件, 可以这样操作: :fromhost-ip, isequal, "192.168.0.160″ /var/log/host160.log : ...

  4. C语言入门(2)——安装VS2013开发环境并编写第一个C语言程序

    在C语言入门系列中,我们使用Visual studio 2013 Professional作为开发工具.本篇详细介绍如何安装Visualstudio 2013 Professional并写出我们第一个 ...

  5. 《我是一只IT小小鸟》 读后感

    <我是一只IT小小鸟>一只是我想读list中一个本,但是上次去当当买的时候,竟然缺货了...昨天监考,实在无聊,就上网看电子书了,一天就看完了,看得有点仓促,所以理解估计不深. 1.刘帅: ...

  6. 跟我一起学extjs5(16--各种Grid列的自己定义渲染)

    跟我一起学extjs5(16--各种Grid列的自己定义渲染)         Grid各列已经可以展示出来了.列的类型包含字符型,整型,浮点型,货币型,百分比型,日期型和布尔型,我自己定义了各种类型 ...

  7. iOS 8.0正式公布啦

    从昨晚開始,苹果新版移动操作系统iOS 8.0開始提供免费下载服务.新版操作系统提供有数百个新功能,当中包含相机功能中添加了延时摄影模式,能够使用其它厂商开发的输入法.购买的App应用程序能够与最多6 ...

  8. jquery JS 左右方向键

    $(function (){ // $(document).keydown(function(e){ var code=e.which; switch (code) { case 38: //上 br ...

  9. SSLSocket实现服务端和客户端双向认证的例子

    首先创建服务器端私有密钥和公共密钥1, keytool -genkey -alias serverkey -keystore kserver.ks    密码: serverpass2, keytoo ...

  10. 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用

    这个是给不喜欢360等提供的桌面浮动网络监控的园友准备的,NetSpeedMonitor 是一个可以在任务栏监控流量的小工具,集成在任务栏上显示,可以手动设置单位.文字大小等.还支持监控日志,相比其他 ...