HDU 5040
http://acm.hdu.edu.cn/showproblem.php?pid=5040
题意比较难懂,有摄像头的位置是可以走的,每回合开始看做人先走摄像头再转,也就是说如果你这回合走之前没有摄像头在照你,走之后摄像头转过来被照,时间也只是+1,而不是+3(伪装是瞬间完成的)
解法显而易见,一个优先队列的bfs,vis数组多开一维,表示时间对4取模
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <map>
using namespace std ;
int n ;
int vis[][][] ;
int b[][][] ;
char mp[][] ;
int aa,bb ;
struct node
{
int x,y ;
int step ;
friend bool operator <(node aaa,node bbb)
{
return aaa.step>bbb.step ;
}
} ;
int dx[]={-,,,,} ;
int dy[]={,,,-,} ;
int bfs(int x,int y)
{
memset(vis,,sizeof(vis)) ;
priority_queue <node> q ;
node s ;
s.x=x ;s.y=y ;s.step= ;
vis[x][y][]= ;
q.push(s) ;
while(!q.empty())
{
node u=q.top() ;
//printf("%d %d %d\n",u.x,u.y,u.step) ;
if(u.x==aa && u.y==bb)
{
return u.step ;
}
q.pop() ;
for(int i= ;i< ;i++)
{
int xx=u.x+dx[i] ;
int yy=u.y+dy[i] ;
if(xx< || xx>=n || yy< || yy>=n)continue ;
if(mp[xx][yy]=='#')continue ;
node p ;
p=u ;
if(b[xx][yy][u.step%] || b[u.x][u.y][u.step%])
{
if(xx==u.x && yy==u.y && !vis[xx][yy][(u.step+)%])
{
p.step++ ;
vis[xx][yy][p.step%]= ;
q.push(p) ;
}
else if(!vis[xx][yy][(u.step+)%])
{
p.x=xx ;p.y=yy ;
p.step+= ;
vis[xx][yy][p.step%]= ;
q.push(p) ;
}
}
else if(!vis[xx][yy][(u.step+)%])
{
p.x=xx ;p.y=yy ;p.step++ ;
vis[xx][yy][p.step%]= ;
q.push(p) ;
}
}
}
return - ;
}
int main()
{
int T ;
scanf("%d",&T) ;
for(int cas= ;cas<=T ;cas++)
{
scanf("%d",&n) ;
for(int i= ;i<n ;i++)
scanf("%s",mp[i]) ;
int x,y ;
memset(b,,sizeof(b)) ;
for(int i= ;i<n ;i++)
{
for(int j= ;j<n ;j++)
{
if(mp[i][j]=='M')
{
x=i ;y=j ;
}
if(mp[i][j]=='N')
{
b[i][j][]=b[i][j][]=b[i][j][]=b[i][j][]= ;
if(i->=)b[i-][j][]= ;
if(j+<n)b[i][j+][]= ;
if(j->=)b[i][j-][]= ;
if(i+<n)b[i+][j][]= ;
}
if(mp[i][j]=='W')
{
b[i][j][]=b[i][j][]=b[i][j][]=b[i][j][]= ;
if(i->=)b[i-][j][]= ;
if(j+<n)b[i][j+][]= ;
if(j->=)b[i][j-][]= ;
if(i+<n)b[i+][j][]= ;
}
if(mp[i][j]=='S')
{
b[i][j][]=b[i][j][]=b[i][j][]=b[i][j][]= ;
if(i->=)b[i-][j][]= ;
if(j+<n)b[i][j+][]= ;
if(j->=)b[i][j-][]= ;
if(i+<n)b[i+][j][]= ;
}
if(mp[i][j]=='E')
{
b[i][j][]=b[i][j][]=b[i][j][]=b[i][j][]= ;
if(i->=)b[i-][j][]= ;
if(j+<n)b[i][j+][]= ;
if(j->=)b[i][j-][]= ;
if(i+<n)b[i+][j][]= ;
}
if(mp[i][j]=='T')
{
aa=i ;bb=j ;
}
}
}
printf("Case #%d: %d\n",cas,bfs(x,y)) ;
}
return ;
}
HDU 5040的更多相关文章
- 2014年北京网络赛 Instrusive HDU 5040 题解 优先队列
网赛的时候看了这道题,发现就是平常的那种基础搜索题. 由于加了一个特殊条件:可以一次消耗3秒或原地停留1秒. 那就不能使用简单的队列了,需要使用优先队列才行. 题意 告诉一副地图:一个起点,一个终点, ...
- hdu 5040 BFS 多维化处理图
http://acm.hdu.edu.cn/showproblem.php?pid=5040 跟这一题http://blog.csdn.net/u011026968/article/details/3 ...
- hdu 5040 bfs
http://acm.hdu.edu.cn/showproblem.php?pid=5040 一个人拿着纸盒子往目的地走 正常情况下一秒走一格 可以原地不动躲在盒子里 也可以套着盒子三秒走一格 ...
- hdu 5040 Instrusive【BFS+优先队列】
11733274 2014-09-26 12:42:31 Accepted 5040 62MS 1592K 4848 B G++ czy 先转一个优先队列的用法: http://www.cppblog ...
- HDU 5040 Instrusive(BFS+优先队列)
题意比较啰嗦. 就是搜索加上一些特殊的条件,比如可以在原地不动,也就是在原地呆一秒,如果有监控也可以花3秒的时间走过去. 这种类型的题目还是比较常见的.以下代码b[i][j][x]表示格子i行j列在x ...
- hdu 5040 Instrusive
Instrusive Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tota ...
- leetcode N-Queens/N-Queens II, backtracking, hdu 2553 count N-Queens, dfs 分类: leetcode hdoj 2015-07-09 02:07 102人阅读 评论(0) 收藏
for the backtracking part, thanks to the video of stanford cs106b lecture 10 by Julie Zelenski for t ...
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1043 & POJ 1077 Eight(康托展开+BFS+预处理)
Eight Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30176 Accepted: 13119 Special ...
随机推荐
- 从 bcp 客户端收到一个对 colid x 无效的列长度。
出现场景: 批量插入数据的时候出现这个问题. 原因分析:某个数据的长度应该是大于这个数据对应的列的定义长度. 所以一一检查到底是那个列的长度超出了. 第一种方法: ——————————2017-1-3 ...
- mvc+ef中比较数据
例如:根据Para表中的type和paraid 字段进行比较 public class TypeComparer : IEqualityComparer<Para> { bool IEqu ...
- Web API初印象
理解REST,RESTful和Web API 1.REST:Representational State Transfer表征状态转移,是Roy Fielding博士在2000年他的博士论文中提出来的 ...
- Could not find artifact com.sun:tools:jar:1.5.0
问题: Failed to execute goal on project petroleum: Could not resolve dependencies for project petroleu ...
- Windows API 文件处理
CloseHandle 关闭一个内核对象.其中包括文件.文件映射.进程.线程.安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirect ...
- 在 Linux 中怎样将 MySQL 迁移到 MariaDB 上
自从甲骨文收购 MySQL 后,由于甲骨文对 MySQL 的开发和维护更多倾向于闭门的立场,很多 MySQL 的开发者和用户放弃了 MySQL.在社区驱动下,促使更多人移到 MySQL 的另一个叫 M ...
- DatagridView自动充满屏幕,并能指定某列宽度
1.要使datagridview正好充满屏幕,设置其AutoSizeColumnsMode属性为fill 2. 同时,我们想要某列宽点,某列窄点,在AutoSizeColumnsMode属性为fill ...
- [开发笔记]-DataGridView控件中自定义控件的使用
最近工作之余在做一个百度歌曲搜索播放的小程序,需要显示歌曲列表的功能.在winform中采用DataGirdView来实现. 很久不写winform程序了,有些控件的用法也有些显得生疏了,特记录一下. ...
- 神奇的NOIP模拟赛 T3 LGTB 玩THD
LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...
- Section 1.4 The Clocks
0 0 虽然不知不觉做到了Section 1.4了,但是都没有把做题的想法和代码发到这里… 本来今天想从Section 1.2补起来然后发现之前做的题都忘了…(Name That Number那道题是 ...