诡异的楼梯

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)

Total Submission(s): 9360    Accepted Submission(s): 2309

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
Hint
Hint
地图例如以下:
 

最终A了,原来刚開始方向搞错了。

说下我的思路:从起点開始,碰到楼梯时推断是否和前进方向同样,若不同则等一分钟再前进,然后到达下一个位置。推断方向时能够用dir(方向)下标和时间的奇偶性。。。

#include"stdio.h"
#include"string.h"
#include"iostream"
#include"queue"
using namespace std;
#define N 25
const int inf=0x1f1f1f1f;
int dir[4][2]={1,0,0,-1,-1,0,0,1};
int n,m,mark[N][N];
char g[N][N];
struct node
{
int x,y,t;
friend bool operator<(node a,node b)
{
return a.t>b.t;
}
};
int bfs(int x,int y)
{
int i,di,dj;
priority_queue<node>q;
node cur,next;
cur.x=x;
cur.y=y;
cur.t=0;
mark[x][y]=0;
q.push(cur);
while(!q.empty())
{
cur=q.top();
q.pop();
if(g[cur.x][cur.y]=='T')
return cur.t;
for(i=0;i<4;i++)
{
next.x=di=dir[i][0]+cur.x;
next.y=dj=dir[i][1]+cur.y;
next.t=cur.t+1;
if(di<0||di>=n||dj<0||dj>=m||g[di][dj]=='*')
continue;
if(g[di][dj]=='|')
{
if(i==0||i==2)
{
if(cur.t%2)
next.t++;
}
else
{
if(cur.t%2==0)
next.t++;
}
next.x+=dir[i][0];
next.y+=dir[i][1];
if(mark[next.x][next.y]>next.t)
{
mark[next.x][next.y]=next.t;
q.push(next);
}
}
else if(g[di][dj]=='-')
{
if(i==1||i==3)
{
if(cur.t%2)
next.t++;
}
else
{
if(cur.t%2==0)
next.t++;
}
next.x+=dir[i][0];
next.y+=dir[i][1];
if(mark[next.x][next.y]>next.t)
{
mark[next.x][next.y]=next.t;
q.push(next);
}
}
else
{
if(mark[next.x][next.y]>next.t)
{
mark[next.x][next.y]=next.t;
q.push(next);
}
}
}
}
}
int main()
{
int i,j,si,sj;
while(scanf("%d%d",&n,&m)!=-1)
{
for(i=0;i<n;i++)
{
scanf("%s",g[i]);
for(j=0;j<m;j++)
{
if(g[i][j]=='S')
{
si=i;sj=j;
}
mark[i][j]=inf;
}
}
printf("%d\n",bfs(si,sj));
}
return 0;
}

hdu 1180 诡异的楼梯 (bfs)的更多相关文章

  1. hdu 1180诡异的楼梯(bfs)

    诡异的楼梯 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submis ...

  2. hdu - 1180 诡异的楼梯 (bfs+优先队列)

    http://acm.hdu.edu.cn/showproblem.php?pid=1180 注意点就是楼梯是在harry移动完之后才会改变方向,那么只要统计到达这个点时间奇偶性,就可以知道当前楼梯是 ...

  3. HDU 1180 诡异的楼梯(超级经典的bfs之一,需多回顾)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1180 诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)     ...

  4. HDU 1180 诡异的楼梯(BFS)

    诡异的楼梯 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status ...

  5. hdu 1180:诡异的楼梯(BFS广搜)

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Subm ...

  6. HDU 1180 诡异的楼梯【BFS/楼梯随时间变化】

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submis ...

  7. hdu 1180 诡异的楼梯

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Subm ...

  8. hdu 1180 诡异的楼梯(广搜,简单)

    题目 挺简单的一道广搜题,只要用判断时间是偶数还是奇数就可以判断楼梯的方位,但是我这傻逼居然写了那么久啊那么久,我果然秀逗了,,,, #define _CRT_SECURE_NO_WARNINGS # ...

  9. HDOJ/HDU 1180 诡异的楼梯(经典BFS-详解)

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

随机推荐

  1. 在Thinkphp3.2 中使用PHPMailer 发送邮件

    phpmailer发送邮件是php开发者首选的一个邮件发送插件了,下面我来介绍怎么集成phpmailer到thinkphp框架了,有需要了解的朋友可参考. phpmailer发送邮件功能很强大,今天真 ...

  2. Delphi中停靠技术的实现

    随着软件技术的不断进步,软件界面也越来越美观,操作也越来越方便.综观市面上比较专业的各种软件,我们会发现大部分都提供窗体停靠的功能,特别象工具软件,基本上都或多或少有停靠功能.自然,Delphi也支持 ...

  3. Frame与启动流程

    1. frame与bounds的区别: frame是从屏幕的左上角开始计算位置,而bounds是从新添加view左上角作为(0,0)开始计算 bounds是以自身为参考系,所以左上角的点为原点 cen ...

  4. 最精简的代理设计模式demo - 保姆看孩子

    1,协议文件 @protocol NursePtotocol <NSObject> //保姆的协议方法 - (void)startToAmuseBaby; @end 2,管理类(使用类) ...

  5. python global 全局变量

    http://blog.csdn.net/mldxs/article/details/8559973 __author__ = 'dell' def func(): global x print 'x ...

  6. [UOJ Round#4 A] [#51] 元旦三侠的游戏 【容斥 + 递推】

    题目链接:UOJ - 51 据说这题与 CF 39E 类似. 题目分析 一看题目描述,啊,博弈论,不会!等待爆零吧... 这时,XCJ神犇拯救了我,他说,这题可以直接搜啊. 注意!是用记忆化搜索,状态 ...

  7. ioc开发学习 --简易计时器 (基于iPhone5屏幕尺寸开发)

    超简单的秒表:包含:开始.暂停(不清零).清零 方法 核心代码 // // ViewController.m // MiaoBiao // // Created by Ibokan on 15/8/1 ...

  8. delphi OnMouseLeave 事件不灵敏及解决之道(使用TrackMouseEvent函数进行加强)

    http://topic.csdn.net/t/20020104/09/456913.html CM_MouseLeave消息好象不太灵敏,当鼠标快速移出窗体时,就收不到这个消息,请问大家有什么好办法 ...

  9. Extjs4中用combox做下拉带图片的下拉框

    今天,莫名的来个一个需求,需要做的一个下拉框中,需要有图片,这不...谷歌+度娘然后找网友,终于搞定.现在感谢这些提供资料的友友... 效果如图:

  10. Unity NGUI 创建简单的按钮

    Unity版本:4.5.1 NGUI版本:3.6.5 注意NGUI版本,网上的大部分教程都是2.x版本的,在步骤上面略有不同,此文适合初学者. 示例: 通过NGUI创建一个背景和按钮. 1.首先创建一 ...