题目链接

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

分析:

这里有一个比较难得地方就是对于走到楼梯的地方时他能不能走,如何走花费的时间比较短,这里对于楼梯的判断要写一个具体的函数来判断。

代码:

#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
char tu[21][21];
int bj[21][21];
int sx,sy,ex,ey,n,m;
int nex1[4][2]= {{1,0},{-1,0},{0,1},{0,-1} };
struct node
{
int x;
int y;
int step;
} now,nex;
bool operator <(node a,node b)
{
return a.step>b.step;
}
int solve(int x,int y,int time,char ch)
{
if(ch == '|' && x == 0)//如果楼梯是竖着的,而且我在水平方向上
{
if(time%2==0)//偶数步,则楼梯还是竖着的,等一秒楼梯变成平的,在过去
time+=2;
else
time++;
}
if(ch == '|' && y == 0)//如果楼梯是竖着的,处于竖直方向上
{
if(time%2==0)//偶数步,楼梯为竖直的,这时候直接过去
time++;
else
time+=2;//否则等一秒,楼梯变成竖着的过去
}
if(ch == '-' && x == 0)//如果楼梯是横着的,现在在水平方向上
{
if(time%2 == 0)//偶数步,到达楼梯前一个位置楼梯还是横的,直接过去
time++;
else
time+=2;//否则,等一分钟楼梯变成横的在过去
}
if(ch == '-' && y == 0)//如果楼梯是横着的,现在在竖直方向上
{
if(time%2==0)//偶数步,楼梯是当前是横着的,过不去,再等一秒
time+=2;
else
time++;//否则直接过去。
}
return time;
}
void bfs(int x,int y)
{
priority_queue<node>q;
now.x=x;
now.y=y;
now.step=0;
q.push(now);
while(!q.empty())
{
now=q.top();
q.pop();
if(now.x==ex&&now.y==ey)
{
cout<<now.step<<endl;
return ;
}
for(int i=0; i<4; i++)
{
nex.x=now.x+nex1[i][0];
nex.y=now.y+nex1[i][1];
if(tu[nex.x][nex.y]!='*'&&nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&bj[nex.x][nex.y]==0)
{
if(tu[nex.x][nex.y]=='.'||tu[nex.x][nex.y]=='T')
{
nex.step=now.step+1;
bj[nex.x][nex.y]=1;
q.push(nex);
}
else if(tu[nex.x][nex.y]=='|'||tu[nex.x][nex.y]=='-')
{
int tx=nex.x+nex1[i][0];
int ty=nex.y+nex1[i][1];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&bj[tx][ty]==0&&tu[tx][ty]!='*')
{
nex.step = solve(nex1[i][0],nex1[i][1],now.step,tu[nex.x][nex.y]);
nex.x=tx;
nex.y=ty;
bj[nex.x][nex.y]=1;
q.push(nex);
}
}
}
}
}
return ;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(bj,0,sizeof(bj));
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
cin>>tu[i][j];
if(tu[i][j]=='S')
{
sx=i;
sy=j;
}
if(tu[i][j]=='T')
{
ex=i;
ey=j;
}
}
bj[sx][sy]=1;
bfs(sx,sy);
}
return 0;
}

HDU 1180 诡异的楼梯 (广搜)的更多相关文章

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

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

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

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

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

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

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

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

  5. hdu 1180 诡异的楼梯

    诡异的楼梯 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 Sub ...

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

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

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

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

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

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

随机推荐

  1. Qt-excel文件操作方法

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt-excel文件操作方法     本文地址:http://techieliang.com/ ...

  2. 【Linux】CentOS安装redis

    CENTOS7下安装REDIS 安装完成之后使用:redis-cli命令连接,如图: 提示:/var/run/redis_6379.pid exists, process is already run ...

  3. C/S结构 B/S结构

    [1]C/S 结构,即大家熟知的客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销.目前大多数应 ...

  4. SpringBoot2.0(五) CORS跨域

    部分跨域 @CrossOrigin注解支持类级别,方法级别添加.可以在controller类或者方法上添加,支持部分接口跨域.在两者上都添加时,方法级别的覆盖类级别的. 属性 说明 origins 允 ...

  5. HTML5+ API 学习

    HTML5+ API 模块整理 API Reference 模块 中文 模块介绍 Accelerometer 加速计 管理设备加速度传感器,用于获取设备加速度信息,包括x(屏幕水平方向).y(垂直屏幕 ...

  6. java从远程服务器获取PDF文件并后台打印(使用pdfFox)

    一.java原生方式打印PDF文件 正反面都打印,还未研究出只打印单面的方法,待解决 public static void printFile(String path) throws Exceptio ...

  7. deep learning2

    九.Deep learning的常用模型或者方法 9.1.AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结 ...

  8. RT-thread内核之邮箱

    一.邮箱控制块:在include/rtdef.h中 #ifdef RT_USING_MAILBOX /** * mailbox structure */ struct rt_mailbox { str ...

  9. C# 大文件的复制方法

    如何复制读取大文件,也许困惑了很多人很长时间,这个不知道怎么搞,的确让人头疼欲裂,知道了你就才发现原来那么简单,话不多说,直入正题```` static void Main(string[] args ...

  10. 用select模拟一个socket server成型版

    1.你往output里面放什么,下次循环就出什么.  2. 1.服务器端:实现了收和发的分开进行 import select,socket,queue server=socket.socket() s ...