诡异的楼梯

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 14267    Accepted Submission(s):
3638

Problem Description
Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.

比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
 
Input
测试数据有多组,每组的表述如下:
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
 
Output
只有一行,包含一个数T,表示到达目标的最短时间.

注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
 
Sample Input
5 5
**..T
**.*.
..|..
.*.*.
S....
 
Sample Output
7
这道题第一次没看清题意,不知道楼梯还tm会转= =,结果卡壳了,
一开始没想到优先队列用的queue,后来发现有特殊情况只好改;
还有就是判断楼梯方向怎么走;

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
char e[25][25];
int n,m,T;
int xa,ya,xb,yb;
int fx[4][2]={-1,0,1,0,0,-1,0,1};
int book[25][25];
struct node
{
int x,y,t;
bool operator<(const node& ch)const{
return t>ch.t;}
};
void walk(int zt,int &dx,int& dy,int i) //zt : 1表示'|',2表示’-‘ 
{
if(zt==1){                                              //楼梯此时为竖状时,根据上下分为两种情况,只能是上下因为已经在bfs里处理过,方向上下走的定是上下楼梯,反之亦然
if(i==0) dx--;
else dx++;
}
else if(zt==2){
if(i==2) dy--;
else dy++;
}
}
void bfs()
{
node temp,cur;
priority_queue<node> q;
temp.x=xa,temp.y=ya,temp.t=0;
book[xa][ya]=1;
q.push(temp);
while(!q.empty()){//cout<<"1";
temp=q.top(),q.pop();
for(int i=0;i<4;i++){
cur=temp;

int dx=cur.x+fx[i][0];
int dy=cur.y+fx[i][1];
if(e[dx][dy]=='|'){
if(cur.t%2==0){ //台阶状态不变为'|'
if(i<2) walk(1,dx,dy,i); //走的是上下方向
else
cur.t++,walk(2,dx,dy,i); //走的是左右方向,等一秒
}
else{
if(i<2) cur.t++,walk(1,dx,dy,i);
else walk(2,dx,dy,i);
}
}
else if(e[dx][dy]=='-'){
if(cur.t%2==0){
if(i>=2) walk(2,dx,dy,i);
else cur.t++,walk(1,dx,dy,i);
}
else{
if(i>=2) cur.t++,walk(2,dx,dy,i);
else walk(1,dx,dy,i);
}
}
cur.t++;
//cout<<"2";
if(dx<1||dy<1||dx>n||dy>m||book[dx][dy]||e[dx][dy]=='*') continue;
book[dx][dy]=1;
cur.x=dx;
cur.y=dy;

if(dx==xb&&dy==yb) {cout<<cur.t<<endl;return;}
q.push(cur);
//cout<<dx<<" "<<dy<<endl;
}
}
}

int main(){
int i,j;
while(cin>>n>>m){memset(book,0,sizeof(book));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>e[i][j];
if(e[i][j]=='S') xa=i,ya=j;
if(e[i][j]=='T') xb=i,yb=j;
}

bfs();
}
return 0;
}

总结:

记得把出发点push进队列md,还有就是不要急于更改最新点的变量,因为有些判断操作可能要用到之前的变量!

+++:

还有就是queue写时注意book[dx][dy]保存(dx,dy)到起点的最小距离,注意加条件(if(cur.t>=book[dx][dy]) continue);如果不加‘=’TLE,Because会造成大量的重复解进入导致内存占用过度

hdu1180 优先队列bfs+判断方向的更多相关文章

  1. hdu 1026 Ignatius and the Princess I【优先队列+BFS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  2. ZOJ 649 Rescue(优先队列+bfs)

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 【POJ3635】Full Tank 优先队列BFS

    普通BFS:每个状态只访问一次,第一次入队时即为该状态对应的最优解. 优先队列BFS:每个状态可能被更新多次,入队多次,但是只会扩展一次,每次出队时即为改状态对应的最优解. 且对于优先队列BFS来说, ...

  4. Codeforces 677D - Vanya and Treasure - [DP+优先队列BFS]

    题目链接:http://codeforces.com/problemset/problem/677/D 题意: 有 $n \times m$ 的网格,每个网格上有一个棋子,棋子种类为 $t[i][j] ...

  5. POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]

    题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...

  6. hdu-5652 India and China Origins(二分+bfs判断连通)

    题目链接: India and China Origins Time Limit: 2000/2000 MS (Java/Others)     Memory Limit: 65536/65536 K ...

  7. 最短路径问题,BFS,408方向,思路与实现分析

    最短路径问题,BFS,408方向,思路与实现分析 继上回挖下的坑,不知道大家有没有认真看最小生成树呢?很简单,这回也讲讲正常难度的,看不懂就来这里看看,讲的很好~~ 最短路径问题 说起这个问题,先说个 ...

  8. 3305: Hero In Maze II (优先队列+bfs)

    Description 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^.突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了, ...

  9. BFS(判断状态) HDOJ 3533 Escape

    题目传送门 题意:一个人从(0, 0)逃往(n, m),地图上有朝某个方向开炮的炮台,问最少逃脱步数 分析:主要在状态是否OK,当t时刻走到(x,y),炮台是否刚好打中,因为只能是整数,所以用整除判断 ...

随机推荐

  1. SNMP学习笔记之SNMP报文协议详解

    0x00 简介 简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议.在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案:由于SNMP的简单 ...

  2. Kali配置网络

    虚拟机NAT网关:192.168.50.1 主机VM8网址:192.168.50.2 虚拟机网卡:192.168.50.30 vim /etc/network/interfaces # The loo ...

  3. C++设计模式 之 “对象创建”模式:Factory Method、Abstract Factory、Prototype、Builder

    part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fact ...

  4. 20145220韩旭飞《网络对抗》实验五:MSF基础应用

    20145220韩旭飞<网络对抗>实验五:MSF基础应用 主动攻击 首先,我们需要弄一个xp sp3 English系统的虚拟机,然后本次主动攻击就在我们kali和xp之间来完成. 然后我 ...

  5. 启动jenkins服务错误

    背景 重新安装了jenkins,需要启动,使用的yum install安装的,启动jenkins的话只需要执行service jenkins start,但出了两个问题 1. 是提示找不到java 2 ...

  6. 深入理解JavaScript的变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...

  7. BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化

    题目链接 咳咳咳,第一次没大看题解做DP 以前的我应该是这样的 哇咔咔,这tm咋做,不管了,先看个题解,再写代码 终于看懂了,卧槽咋写啊,算了还是抄吧 第一问类似于noip的那个跳房子,随便做 这里重 ...

  8. [JVM] - 一份<自己动手写Java虚拟机>的测试版

    go语言下载 配置GOROOT(一般是自动的),配置GOPATH(如果想自己改的话) 参照<自己动手写Java虚拟机> > 第一章 指令集和解释器 生成了ch01.exe文件 这里还 ...

  9. [oracle复习] - Oracle

    https://deadzq.github.io/oracle/Oracle.html 我的oracle笔记1 https://deadzq.github.io/oracle/Oracle2.html ...

  10. redis持久化RDB和AOF-转载

    Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...