诡异的楼梯

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

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

如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达
目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写
的.
 
Input
测试数据有多组,每组的表述如下:

一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位
置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N&
lt;=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
 
Output
只有一行,包含一个数T,表示到达目标的最短时间.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
 
Sample Input
5 5
**..T
**.*.
..|..
.*.*.
S....
 
Sample Output
7

Hint

Hint

地图如下:

 
Source
 
当奇数时间到达'|'或'-'时,所以这个时候原图的'|'会变成'-',所以只能横向走了,'-'的话就会变成'|',只能竖着走了。
当偶数时间到达'|'或'-'时,原图不会变,所以'|'还是可以竖着走,'-'也是横着走。
最重要的地方来了,这个题目有个隐含条件,我开始没注意到,题目没有不可达的情况!!所以这也暗示了在前面有楼梯的情况下但是楼梯不可达的情况下我们可以在原地等一分钟,这个隐含条件一定要挖掘出来。不然会WA。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
typedef long long LL;
char graph[][];
bool vis[][];
struct Node
{
int x,y,step;
};
Node s,t;
int dir[][] = {{-,},{,},{,-},{,}};
int n,m;
bool check(int x,int y)
{
if(x<||x>=n||y<||y>=m||vis[x][y]||graph[x][y]=='*')
return false;
return true;
}
int bfs()
{
memset(vis,false,sizeof(vis));
queue<Node> q;
vis[s.x][s.y]=true;
q.push(s);
while(!q.empty())
{
Node node = q.front();
q.pop();
if(node.x==t.x&&node.y==t.y)
{
return node.step;
}
Node next;
for(int i=; i<; i++)
{
next.x = node.x+dir[i][];
next.y = node.y+dir[i][];
next.step=node.step+;
if(!check(next.x,next.y)) continue;
if(graph[next.x][next.y]=='.')
{
vis[next.x][next.y]=true;
q.push(next);
}
if(graph[next.x][next.y]=='|')
{
if((next.step%==)&&(i==||i==)) ///now this place change to '-'
{
next.x+=dir[i][];
next.y+=dir[i][];
if(check(next.x,next.y)){
vis[next.x][next.y]=true;
q.push(next);
}
}
else if((next.step%==)&&(i==||i==)) ///stay '|'
{
next.x+=dir[i][];
next.y+=dir[i][];
if(check(next.x,next.y)){
vis[next.x][next.y]=true;
q.push(next);
}
}else{ ///隐含条件,等下一分钟
next.x= node.x;
next.y = node.y;
q.push(next);
}
}
if(graph[next.x][next.y]=='-')
{
if((next.step%==)&&(i==||i==)) ///now this place change to '|'
{
next.x+=dir[i][];
next.y+=dir[i][];
if(check(next.x,next.y)){
vis[next.x][next.y]=true;
q.push(next);
}
}
else if((next.step%==)&&(i==||i==)) ///stay '-'
{
next.x+=dir[i][];
next.y+=dir[i][];
if(check(next.x,next.y)){
vis[next.x][next.y]=true;
q.push(next);
}
}else{ ///等下一分钟
next.x= node.x;
next.y = node.y;
q.push(next);
}
}
}
}
return -;
}
int main()
{ while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=; i<n; i++)
{
scanf("%s",graph[i]);
for(int j=; j<m; j++)
{
if(graph[i][j]=='S')
{
s.x = i,s.y = j,s.step=;
graph[i][j]='.';
}
else if(graph[i][j]=='T')
{
t.x = i,t.y = j;
graph[i][j]='.';
}
}
}
int res = bfs();
printf("%d\n",res);
}
return ;
}

hdu 1180(广搜好题)的更多相关文章

  1. POJ3984 BFS广搜--入门题

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20816   Accepted: 12193 Descriptio ...

  2. hdu 1072 广搜(逃离爆炸迷宫)

    题意: 在n×m的地图上,0表示墙,1表示空地,2表示人,3表示目的地,4表示有定时炸弹重启器.定时炸弹的时间是6,人走一步所需要的时间是1.每次可以上.下.左.右移动一格.当人走到4时如果炸弹的时间 ...

  3. HDU 2717 宽搜第一题、

    题意:求n到k的最小路径,  n有三种变法 n+1,n-1或者2*n: 贴个广搜的模版在这里把.... 总结一下:一般涉及到求最短路的话用宽搜 #include<iostream> #in ...

  4. hdu 1175(广搜)

    题意:容易理解... 思路:我开始的思路不好实现,而且有漏洞,时间复杂度也高,后来在网上学了下别人的方法,真心感觉很牛B,不仅代码好实现,而且时间复杂度比较低,具体看代码实现吧!! 代码实现: #in ...

  5. poj 1184 广搜进阶题

    起初的想法果然就是一个6000000的状态的表示. 但是后面觉得还是太过于幼稚了. 可以看看网上的解释,其实就是先转换位置,然后再改变数字的大小. #include<iostream> # ...

  6. hdu 1072 广搜

    路径是可以重复走的,但是如果再一次走过时间重置点是没有意义的 #include <iostream> #include <cstdio> #include <cstrin ...

  7. hdu 2612:Find a way(经典BFS广搜题)

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  9. hdu 1253:胜利大逃亡(基础广搜BFS)

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

随机推荐

  1. CPL学习笔记(二)

    数组 数组(array) 声明通用格式为: typeName arrayName[arraySize]. arrayName指定元素数目,必须为整型常量或const值.(不能是变量) int a[3] ...

  2. skimage学习(一)

    skimage即是Scikit-Image.基于python脚本语言开发的数字图片处理包 skimage包由许多的子模块组成,各个子模块提供不同的功能.主要子模块列表如下: data子模块学习 导入d ...

  3. redis cluster 配置

    #服务器192.168.56.111 192.168.56.112 192.168.56.113 计划1主2从   192.168.56.111 192.168.56.112 192.168.56.1 ...

  4. jsp内置对象及其方法

    JSP中一共预先定义了9个这样的对象,分别为:   request.   response.   session.   application.   out.   pagecontext.   con ...

  5. type和object

    一.定义 1.object是所有新式类的父类 2.type是所有类的类    二.解析   下面通过代码来比较一下object和type的关系(__class__获取所属的类,__bases__获取父 ...

  6. Java做爬虫也很方便

    首先我们封装一个Http请求的工具类,用HttpURLConnection实现,也可以用HttpClient, 或者直接用Jsoup来请求. 工具类实现比较简单,就一个get方法,读取请求地址的响应内 ...

  7. bzoj3262陌上花开 三维数点 cdq+树状数组

    大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ...

  8. loj2005 「SDOI2017」相关分析

    鬼畜线段树--Orz Capella #include <iostream> #include <cstdio> using namespace std; int n, m, ...

  9. LoadRunner web_set_sockets_option()--常用函数

    web_set_sockets_option()--常用函数 设置sockets的选项. intweb_set_sockets_option(const char * option,const cha ...

  10. Mongodb 删除记录里的某个字段

    //例如要把User表中address字段删除 db.User.update({},{$unset:{'address':''}},false, true)