诡异的楼梯

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. 0-5v转0-20ma和0-5v转4-20ma

    0-5v转0-20ma 0-5v转4-20ma

  2. python集合set{ }、集合函数及集合的交、差、并

    通过大括号括起来,用逗号分隔元素,特点 1.由不同元素组成,如果定义时存在相同元素,处理时会自动去重 2.无序 3.元素只能是不可变类型,即数字.字符串.布尔和元组,但集合本身可变 4.可直接定义集合 ...

  3. Android实践项目汇报(三)

    Google天气客户端 本周学习计划 调试代码使之成功运行并实现天气预报功能. 实际完成情况 由于google取消api接口服务,天气源的传输.所以我换了一个使用 haoserver API接口的程序 ...

  4. 三星核S5PV210AH-A0 SAMSUNG

    三星S5PV210AH-A0 S5PV210又名“蜂鸟”(Hummingbird),是三星推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器,S5PV210和S5PC110功能一样,110小封 ...

  5. vim的加密和解密?

    vim中出现的错误提示含义: 参考: http://blog.csdn.net/u014599371/article/details/43955169 E488: trailing character ...

  6. fastjson 简单使用 及其JSONObject使用

    阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser. ...

  7. JavaScript:Object属性方法

    Object的属性(firebug中没有找到) var pro={ city:"shanghai", list:[,,,,] } var Person=function(name, ...

  8. 【安装】Mysql在Linux上安装

    1.下载 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下载版本:mysql-5.6.37-linux-glibc2.12- ...

  9. Python matplot画散列图

    同matlab一样,matplot也可画散列图scatter. import numpy as np import matplotlib.pyplot as plt #fig = plt.figure ...

  10. 使用docker安装myql/redis等软件

    使用docker安装myql/redis等软件 概述 基本命令 安装mysql 安装redis 概述 在开发时经常需要安装各种软件,有时甚至为了验证一个命令不得不安装配置一个缓存.数据库.MQ等,耽误 ...