hdu 5040 BFS 多维化处理图
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 多维化处理图的更多相关文章
- hdu 5040 bfs
http://acm.hdu.edu.cn/showproblem.php?pid=5040 一个人拿着纸盒子往目的地走 正常情况下一秒走一格 可以原地不动躲在盒子里 也可以套着盒子三秒走一格 ...
- hdu 5517 Triple(二维树状数组)
Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu 4531 bfs(略难)
题目链接:点我 第一次不太清楚怎么判重,现在懂了,等下次再做 /* *HDU 4531 *BFS *注意判重 */ #include <stdio.h> #include <stri ...
- WebGl 二维纹理贴图(矩形)
效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- 2014年北京网络赛 Instrusive HDU 5040 题解 优先队列
网赛的时候看了这道题,发现就是平常的那种基础搜索题. 由于加了一个特殊条件:可以一次消耗3秒或原地停留1秒. 那就不能使用简单的队列了,需要使用优先队列才行. 题意 告诉一副地图:一个起点,一个终点, ...
- Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph)
Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree ...
- HDU 1429 (BFS+记忆化状压搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1429 题目大意:最短时间内出迷宫,可以走回头路,迷宫内有不同的门,对应不同的钥匙. 解题思路: 要是 ...
- HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)
题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...
- hdu 5040 Instrusive【BFS+优先队列】
11733274 2014-09-26 12:42:31 Accepted 5040 62MS 1592K 4848 B G++ czy 先转一个优先队列的用法: http://www.cppblog ...
随机推荐
- Cortex-M3 动态加载一(地址无关代码实现)
这篇文章是自己疑惑究竟地址无关性是如何实现,然后查看汇编和CPU指令手册,最后分析解除自己疑惑的,高手不要鄙视,哈哈. 编译C代码时候需要制定--acps/ropi选项,如下例子: void Syst ...
- Linux进程管理命令
CentOS默认并没有安装上psmisc这个软件包,就是像pstree,fuser这类的命令就没有了.如果想要执行这些命令最好的方法就是手动的去安装它们 解决方法: yum -y install ps ...
- [问题解决] initAndListen: 10309 Unable to create/open lock file: /data/db/mongod.lock
错误: 在linux下开启mongoDB的 $ >bin: ./mongod 时报错:initAndListen: 10309 Unable to create/open lock file: ...
- 正版Win7永不崩溃的秘密 解密系统备份!
备份正版Win7系统 打开Win7系统的控制面板,进入“备份和还原”选项,即可要使用正版Win7系统的备份还原功能. 进入Win7“备份和还原”功能 点击“设置备份”,即可启动Windows 备份程序 ...
- Ignatius and the Princess III(母函数)
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 【菜鸟学习Linux】-第三章- Linux环境搭建-使用VMware9安装Ubuntu 12.04系统
上一步,我们安装了VMware9虚拟机,现在我们就是用它来安装Ubuntu12.04系统,至于Ubuntu是什么,我就不废话了,大家google一下,比我讲的清楚,好了,开始干活! Ubuntu官网下 ...
- Unity3D游戏开发从零单排(五) - 导入CS模型到Unity3D
游戏动画基础 Animation组件 Animation组件是对于老的动画系统来说的. 老的动画形同相应的动画就是clip,每一个运动都是一段单独的动画,使用Play()或CrossFade(),直接 ...
- 表A中有两个表示时间的字段A,B;如果B的值大于A的值,则把B的值更新为A的值
sql语句:表A中有两个表示时间的字段A,B:如果B的值大于A的值,则把B的值更新为A的值 update 表名 set B=A where B>A
- 创建自己的yum软件源(以Cloudera Hadoop的安装为例)
.下载Cloudera Manager安装文件 Cloudera Manager的可以从如下网址获得: http://archive.cloudera.com/cm4/installer/ 这里选择C ...
- ASP.Net中使用Report Service
昨天研究以下Report Service,发现SQL Service自带的报表服务器也非常强大, 一,报表在不同的应用中表现形式 参考:http://www.cnitblog.com/yide/arc ...