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. Fidder 工具使用

    Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大 ...

  2. 1.9 需求订单导入MDS

    1.9          需求订单导入MDS 1.9.1   业务方案描述 将”需求订单维护表”中完成调整维护的需求订单导入系统标准MDS中,使之驱动对应的物料需求计划(MRP)的运行. 1.9.2  ...

  3. 在cad中画一条长500mm,垂直90度的线段

    视频教程奉上 方法1.点击线段按钮,鼠标指定一点,输入500,再输入<90. 方法2,点击线段按钮,鼠标指定一点,输入500,按tab,再输入90.

  4. Unix/Linux环境C编程入门教程(8) FreeBSD CCPP开发环境搭建

    1. FreeBSD是一种自由类Unix操作系统,是由经过BSD.386BSD和4.4BSD发展而来的类Unix的一个重要分支.FreeBSD拥有超过200名活跃开发者和上千名贡献者.FreeBSD被 ...

  5. TraceView简单使用方法

    一.TraceView简介 TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析. TraceView是图形化的工具,最终它 ...

  6. Android 开发ListView适配器优化

    我们都知道Android中Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View.想过没有? 在我们的列 ...

  7. Android getReadableDatabase() 和 getWritableDatabase()

    Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例.(getReadableDa ...

  8. sql存储过程的简单使用

    存储过程(Stored Procedure)是数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. 创建 ...

  9. android webview点击返回键回到上一个html

    android webview点击返回键返回上一个html @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ( ...

  10. powerdesigner反向MySQL5.1数据库 生成ER图

    我用的powerdesigner是15.1版本,数据库是MySQL5.1.57 (1)首先新建一个“PhysicalDataModel”类型的文件,然后点击“Database”->"C ...