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. VS Code调试.NET Core

    VS Code调试.NET Core应用遇到的坑 为什么会有”坑“ 博客园里有好多介绍怎么使用VS Code以及调试.NET Core的文章,但是都是基于直接构建Asp.Net Core Mvc单项目 ...

  2. Combotree,datebox 启用 禁用

    combotree <input type="checkbox" id="ckMonitor"></input> <input i ...

  3. OpenNMS Log Correlator

  4. Delphi下TLabel鼠标MouseEnter、MouseLeave更改颜色失灵

    在Delphi 7下,如果想在鼠标MouseEnter.MouseLeave的时候改变TLabel自身的颜色,很多人可能会采用 Label.Color := clRed;这样的方式来实现,我当初也是一 ...

  5. fragment、ListFragment使用ListView及自定义Listview等初始化操作

    fragment.ListFragment使用ListView及自定义Listview等初始化操作 1.先说一下 从官方api中说fragment碎片中使用Listview有专门的 ListView碎 ...

  6. html 基本标签

    HTML 基本标签 Web 服务器工作原理 HTML 注释 HTML 基本标签 http://192.168.32.36:8080/scan/demo.html scan 表示你的应用资源目录 HTM ...

  7. [LeetCode][Python]ZigZag Conversion

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/zigzag- ...

  8. linux 磁盘空间扩容 vg(+pv) lv(+空间) lv(缩减磁盘空间)

    preFace APP scenario description: 当你未能合理的规划存储时,在后期的维护工作中可能会涉及的存储的 再规划(eg,某一个 or 数个App 对某一个lv 即挂载点写Bi ...

  9. 解析微信node开发;拿token

    获取token,本着两个原则, 1.先查询是否有token,有的话判断其时间是否与上一次请求时间差是否超过7100: a.不超过,直接用得到: b.超过,再获取刷新: 2.没有token获取刷新tok ...

  10. 在线词典php

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...