诡异的楼梯

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. C语言程序运行

    vs2013编辑器 c程序的运行   一.启动Microsoft Visual C++  2013版.新建项目 . 1.  文件——> 新建——> 项目.       2. 确定之后 弹出 ...

  2. 洛谷 P5016 龙虎斗

    输入兵营总数.兵营人数.以m分界. 然后输入s1个兵到了p1兵营. 最终我们要求的是把s2个兵放到哪个兵营使龙虎双方气势差距最小. 第一要把每个兵营的气势算出来,并且加到它所属的阵营里(<m是龙 ...

  3. Windows10 关闭自动更新

    win+R调出运行窗口: 输入services.msc,查找 跳出服务窗口,点击windows update设置禁用即可 Windows Update Medic Service没办法禁用,需要采用其 ...

  4. Thinkphp5的安装

    很长没有码代码了,现在开始做这件事情的意义已经完全与以前不一样了.因为最近有相当长的一段休息时间,是个学习的好时间啊.之前接触过TP3.2,听说后来的版本有挺大的改动,因此呢,现在终于有时间可以好好的 ...

  5. 再生龙备份还原linux系统

    相关下载: Clonezilla再生龙:http://sourceforge.net/projects/clonezilla/files/clonezilla_live_stable/ tuxboot ...

  6. OOP面向对象形式的初使化配置

    init.php里: <?php use ElemeOpenApi\Config\Config; define("BASE_DIR", dirname(__FILE__) . ...

  7. matplotlib学习记录 二

    # 绘制10点到12点的每一分钟气温变化折线图 import random from matplotlib import pyplot as plt # 让matplotlib能够显示中文 plt.r ...

  8. python输出mssql 查询结果示例

    # -*- coding: utf-8 -*-# python 3.6import pymssql conn=pymssql.connect(host='*****',user='******',pa ...

  9. graph-bfs-八数码问题

    这个看起来是童年回忆:) 大体思路是,将每个排列状态看成图中的一个点,状态之间转换说明有边.然后用bfs,如果遍历完之后还是没有找到目标状态, 则说明是无解的,否则输出步数.具体想法写在代码里吧,多多 ...

  10. selenium2常用API介绍

    我们模拟web操作都是基于元素来操作的,我们首先要先确定元素,然后这个元素下对应的方法就可以看WebElement的方法. 1.点击操作 WebElement button=driver.findEl ...