2014北京网络赛09题,hdu 5040

这次网络赛真是惨,也怪做题策略没想好,当时切完签到题之类的水题之后,马上就去看06青蛙那题去了。结果被那只死青蛙给坑惨了T_T。。。搞了四小时没搞出来...跪给那只青蛙了。。。本来当时是准备要做这道题的,题目描述也是好蛋疼,有人说这题不如直接去看Clarification,不看题目了,这也说明这题题目描述确实不清晰,虽然没这么夸张,题目还是得看的。

重新看这道题,不是很难,最短时间的话,那当然想到BFS,纯BFS的话,只是最短步数,所以我们需要+优先队列。状态的话,只需要坐标(x,y)还有时间cur_t%4这三个元素就行了。

解释一下为什么是cur_t%4,仔细想想会发现,这一题每个状态之间的不同点,除了当前位置的坐标,还有所有监视器的转向,而这个转向是以4为周期的没错吧,所以,只要某两个状态的坐标相同,且t%4也相同的话,那么这就是一个状态,压进队列一次就不用再压第二次了。除了这一点,其他应该没什么难点。后来写了一份代码,一炮就过了。。T_T为什么当时没先做这个?

代码:

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define N 511
using namespace std;
int n,dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};//E==0,S==1,W==2,N==3
int change[110];
bool vis[N][N][5];
char a[N][N];
struct node
{int x,y,t;node(){;}   //构造函数node(int xx,int yy,int tt){x=xx,y=yy,t=tt;}//构造函数bool operator<(const node s)const{return t>s.t;}
};
int check(int x,int y,int t)//return 1代表该位置当前被灯照到,2代表当前位置没有灯照射,也可以走,0代表不可达
{if(x<1||x>n||y<1||y>n||a[x][y]=='#') return 0;if(change[a[x][y]]!=-1) return 1;for(int i=0;i<4;i++)//要知道当前点有没有被照到,需要查看当前点四个方向上有没有灯朝向这个点{int xx=x+dir[i][0],yy=y+dir[i][1];if(xx<1||xx>n||yy<1||yy>n) continue;int tmp=change[a[xx][yy]];//tmp>=0代表当前点有灯if(tmp>=0&&(tmp+t)%4==i) return 1;//(tmp+t)代表当前时间,%4代表此时灯的转向,稍微设计了一下方向函数dir,使得(tmp+t)==i的时候,说明该点被照到}return 2;
}
int bfs(int sx,int sy)
{memset(vis,0,sizeof(vis));priority_queue<node> que;que.push(node(sx,sy,0));while(!que.empty()){node tmp=que.top();que.pop();if(a[tmp.x][tmp.y]=='T') return tmp.t;int cur_t;//不移动的情况cur_t=tmp.t+1;if(!vis[tmp.x][tmp.y][cur_t%4]) vis[tmp.x][tmp.y][cur_t%4]=1,que.push(node(tmp.x,tmp.y,cur_t));int flag=check(tmp.x,tmp.y,tmp.t);//flag=1说明当前点被照亮for(int i=0;i<4;i++){int cx=tmp.x+dir[i][0],cy=tmp.y+dir[i][1];int che=check(cx,cy,tmp.t);if(che==0) continue;if(che==1||flag==1) cur_t=tmp.t+3;//要移动的点或者当前点被照亮else if(che==2) cur_t=tmp.t+1;if(!vis[cx][cy][cur_t%4])vis[cx][cy][cur_t%4]=1,que.push(node(cx,cy,cur_t));}}return -1;
}
int main()
{#ifndef ONLINE_JUDGEfreopen("D:/in.txt","r",stdin);#endif // ONLINE_JUDGEmemset(change,-1,sizeof(change));change['E']=0,change['S']=1,change['W']=2,change['N']=3;int T,cas=1;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%s",a[i]+1);int sx,sy;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(a[i][j]=='M') sx=i,sy=j;int ans=bfs(sx,sy);printf("Case #%d: %d\n",cas++,ans);}return 0;
}

hdu 5040 Instrusive【BFS+优先队列】相关推荐

  1. HDU 1242 Rescue BFS+优先队列

    题目链接:点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1242 #include <stdio.h> #include <stri ...

  2. hdu 1254(dfs+bfs+优先队列)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Desc ...

  3. HDU 4857 拓扑排序 优先队列

    n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...

  4. nc15665 maze 题解 (传送门) 广搜bfs+优先队列

    maze:原题链接 题目描述: 小明来到一个由n x m个格子组成的迷宫 ,有些格子是陷阱,用'#'表示,小明进入陷阱就会死亡,'.'表示没有陷阱.小明所在的位置用'S'表示,目的地用'T'表示. 小 ...

  5. Instrusive hdu 5040 优先队列+BFS

    题目描述: The legendary mercenary Solid Matt gets a classic mission: infiltrate a military base. The mil ...

  6. Instrusive 【HDU - 5040】【2014 北京 BFS】

    题目链接 一道有着很多需要细节的地方需要注意的题,挺不错的. 这题的数据也是给的很好,然后讲一下题意吧. 题意:有一个N*N的网格,有起点M和终点T,我们从起点需要走到终点,每一步需要花费的时间是单位 ...

  7. HDU5040 Instrusive,bfs+优先队列

    1.题目叙述: Instrusive Time Limit: 3000/1500 MS(Java/Others)    Memory Limit: 262144/262144 K(Java/Other ...

  8. hdu 1818 It's not a Bug, It's a Feature!(位运算+bfs优先队列)

    题意:给一个长度为n的bug,和m个补丁,然后是m个补丁的描述.第一个数字是这个补丁消耗的时间. 第1个字符串是这个补丁要工作需要满足的条件,第2个字符串是这个补丁的作用 详细一点说, 对于第一个字符 ...

  9. hdu.1254.推箱子(bfs + 优先队列)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

最新文章

  1. 聊聊技术、利基市场、激情与梦想
  2. C# 数据库连接池 线程安全 单例模式 的实现
  3. oracle java vm,我可以使用Oracle Java 7 HotSpot VM安装DCEVM吗?
  4. 为什么zookeeper集群中节点配置个数是奇数个?
  5. HDU1555 How many days?【水题+模拟】
  6. 微服务学习之01父工程创建【Hoxton.SR1版】
  7. 使用vue -cli脚手架构建项目组件的全局注册与本地注册
  8. 190113每日一句
  9. NIOS_Altera EPCS下载 注意事项20210815
  10. 微信发红包案例测试场景
  11. 目前股指期货保证金(目前股指期货保证金是多少)
  12. 1分钟学会系统安装方法,win7 XP win10 win11都变得非常简单
  13. Matlab如何绘制小提琴图?
  14. 阿拉伯数字 转 汉字大写
  15. 如何将多个excel表格合并成一个_如何将多个PDF文档合并为一个
  16. Apache中间件漏洞深析
  17. 【蓝桥杯】2015初赛 三羊献瑞
  18. 日本科学家的AI读心术,解码脑电波,还原人眼所见
  19. Hash哈希查找算法
  20. 程序“[3856] ConsoleApplication1.exe”已退出,返回值为 0 (0x0)

热门文章

  1. Spring Batch 之 skip讲解(九)
  2. 计算机三维动画的应用领域有哪些,三维动画的应用领域
  3. 阿里Java面试都问什么?技术四面:一面+二面+总监三四面
  4. java动态sql语句
  5. C# 面试题整理与分享
  6. C++中的函数指针与宏函数总结
  7. 大数据常见面试题之数据仓库
  8. 青春禁忌游戏—兄弟连IT教育
  9. 1331. 数组序号转换 : 简单模拟题
  10. [源码和文档分享]使用TerminateProcess函数实现结束指定进程