诡异的楼梯

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. xubuntu14.04截图,彻底到Linux一个半月后记

        前言 自学计算机技术,越到后面,越依赖ubuntu,以致于很多时候都是一开机就打开虚拟机上的ubuntu10.04,Linux已经变得越来越重要了. 2014-04-17,ubuntu14.0 ...

  2. curl获取http请求的状态码

    $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); //设置头文件的信息作为数据流输出 curl_setopt($curl, CUR ...

  3. TatukGIS-TGIS_ShapeArc.GetPointOnLine

    function GetPointOnLine(const _distance: Double; const _offset: Double; const _part: Integer): TGIS_ ...

  4. [r]Setting up Django and your web server with uWSGI and nginx

    Setting up Django and your web server with uWSGI and nginx This tutorial is aimed at the Django user ...

  5. WWDC2014之App Extensions学习笔记

    一.关于App Extensions extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制. extension的出现,为用户 ...

  6. E: Some packages could not be authenticated

    问题:          在Ubuntu上,安装软件时出现了“E: Some packages could not be authenticated”错误. 原因:     表示系统无法验证这个软件包 ...

  7. NSDictionary 使用总结

    NSDictionary使用小结 #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @ ...

  8. 阿里云的esc

    云服务器ecs作用如下:1.完全管理权限:对云服务器的操作系统有完全控制权,用户可以通过连接管理终端自助解决系统问题,进行各项操作:2.快照备份与恢复:对云服务器的磁盘数据生成快照,用户可使用快照回滚 ...

  9. 转:六百字读懂Git

    原文来自于:http://www.techug.com/git-in-600-words 译注:来自 Hacker School 的 Mary Rose Cook 最近实现了一个纯 JavaScrip ...

  10. crf 分词(待)

    http://blog.csdn.net/marising/article/details/5769653