诡异的楼梯

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. Oracle数据库之PL/SQL触发器

    Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...

  2. C#遍历所有的Textbox控件并赋值为String.Empty

    foreach (Control control in this.Controls) { if (control.GetType().Name.Equals("TextBox")) ...

  3. Mysql访问 for橙子小海

    package com.mvc.model.dao; import com.mvc.model.daoutil.DBConn; import com.mvc.model.entity.Blog; 这是 ...

  4. Java中的自动拆箱装箱(Autoboxing&Unboxing)

    一.基本类型打包器 1.基本类型:long.int.double.float.boolean 2.类类型:Long.Integer.Double.Float.Boolean 区别:基本类型效率更高,类 ...

  5. 转:Gulp使用指南

    原文来自于:http://www.techug.com/gulp Grunt靠边,全新的建构工具来了.Gulp的code-over-configuration不只让撰写任务(tasks)更加容易,也更 ...

  6. Zabbix的LLD功能--Low-level discovery

    感觉这个主题是和一个主题是一个系列,而且更基础. 准备深入研究一下... 相关文档准备: https://www.zabbix.com/documentation/2.0/manual/discove ...

  7. 对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间

    | test100 | CREATE TABLE `test100` ( `sn` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增编号', `phoneNo` ...

  8. 【HDOJ】1818 It's not a Bug, It's a Feature!

    状态压缩+优先级bfs. /* 1818 */ #include <iostream> #include <queue> #include <cstdio> #in ...

  9. bzoj3275

    容易想到是最小割(最大权独立集)然后每个数拆成两个点,不能同时选的之间连边跑最小割,最后答案=总数-mincut/2 因为这样建图将流量变成了原来的两倍 当然这道题更好的建图方法是分成奇数和偶数两个集 ...

  10. POJ 2762 Going from u to v or from v to u?(强联通 + TopSort)

    题目大意: 为了锻炼自己的儿子 Jiajia 和Wind 把自己的儿子带入到一个洞穴内,洞穴有n个房间,洞穴的道路是单向的. 每一次Wind 选择两个房间  x 和 y,   让他的儿子从一个房间走到 ...