hdu 5040 Instrusive【BFS+优先队列】
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+优先队列】相关推荐
- HDU 1242 Rescue BFS+优先队列
题目链接:点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1242 #include <stdio.h> #include <stri ...
- hdu 1254(dfs+bfs+优先队列)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Desc ...
- HDU 4857 拓扑排序 优先队列
n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...
- nc15665 maze 题解 (传送门) 广搜bfs+优先队列
maze:原题链接 题目描述: 小明来到一个由n x m个格子组成的迷宫 ,有些格子是陷阱,用'#'表示,小明进入陷阱就会死亡,'.'表示没有陷阱.小明所在的位置用'S'表示,目的地用'T'表示. 小 ...
- Instrusive hdu 5040 优先队列+BFS
题目描述: The legendary mercenary Solid Matt gets a classic mission: infiltrate a military base. The mil ...
- Instrusive 【HDU - 5040】【2014 北京 BFS】
题目链接 一道有着很多需要细节的地方需要注意的题,挺不错的. 这题的数据也是给的很好,然后讲一下题意吧. 题意:有一个N*N的网格,有起点M和终点T,我们从起点需要走到终点,每一步需要花费的时间是单位 ...
- HDU5040 Instrusive,bfs+优先队列
1.题目叙述: Instrusive Time Limit: 3000/1500 MS(Java/Others) Memory Limit: 262144/262144 K(Java/Other ...
- hdu 1818 It's not a Bug, It's a Feature!(位运算+bfs优先队列)
题意:给一个长度为n的bug,和m个补丁,然后是m个补丁的描述.第一个数字是这个补丁消耗的时间. 第1个字符串是这个补丁要工作需要满足的条件,第2个字符串是这个补丁的作用 详细一点说, 对于第一个字符 ...
- hdu.1254.推箱子(bfs + 优先队列)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
最新文章
- 聊聊技术、利基市场、激情与梦想
- C# 数据库连接池 线程安全 单例模式 的实现
- oracle java vm,我可以使用Oracle Java 7 HotSpot VM安装DCEVM吗?
- 为什么zookeeper集群中节点配置个数是奇数个?
- HDU1555 How many days?【水题+模拟】
- 微服务学习之01父工程创建【Hoxton.SR1版】
- 使用vue -cli脚手架构建项目组件的全局注册与本地注册
- 190113每日一句
- NIOS_Altera EPCS下载 注意事项20210815
- 微信发红包案例测试场景
- 目前股指期货保证金(目前股指期货保证金是多少)
- 1分钟学会系统安装方法,win7 XP win10 win11都变得非常简单
- Matlab如何绘制小提琴图?
- 阿拉伯数字 转 汉字大写
- 如何将多个excel表格合并成一个_如何将多个PDF文档合并为一个
- Apache中间件漏洞深析
- 【蓝桥杯】2015初赛 三羊献瑞
- 日本科学家的AI读心术,解码脑电波,还原人眼所见
- Hash哈希查找算法
- 程序“[3856] ConsoleApplication1.exe”已退出,返回值为 0 (0x0)