诡异的楼梯

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;
int m,n,sx,sy,ex,ey;
char ss[30][30];
int flag[30][30];
struct lmx{
 int x;
 int y;
 int time;
   bool operator <(const lmx s)const
    {
  return time>s.time;
    }
};
int c[4]={0,1,0,-1};
int d[4]={-1,0,1,0};
int is(int x,int y)
{
 return x>=0&&x<m&&y>=0&&y<n;
}
int isarea(int x,int y,int time,int dir)
{
 if(time%2==0)
 {
  if(ss[x][y]=='|')
  {
   if(dir==0||dir==2)  time=time+1;
  }
  else
  {
   if(dir==1||dir==3)  time=time+1;
  }
 }
 else
 {
  if(ss[x][y]=='|')
  {
   if(dir==1||dir==3)  time=time+1;
  }
  else
  {
   if(dir==0||dir==2) time=time+1;
  }
 }
 return time+1;
}
priority_queue<lmx>q;
int bfs()
{
    while(!q.empty()) q.pop();
 int i;
    lmx s1,s2,sp;
 s1.x=sx;
 s1.y=sy;
 s1.time=0;
 q.push(s1);
 flag[sx][sy]=1;
    while(!q.empty())
 {
  s2=q.top();
  q.pop();
  if(s2.x==ex&&s2.y==ey)  return s2.time;
        for(i=0;i<4;i++)
  {
   int xx=s2.x+c[i];
   int yy=s2.y+d[i];
            sp.x=xx;
   sp.y=yy;
   sp.time=s2.time;
   if(is(xx,yy)&&flag[xx][yy]==0)
   {  
    if(ss[xx][yy]=='.'||ss[xx][yy]=='T')
    {
     sp.time=sp.time+1;
     flag[xx][yy]=1;
     if(sp.x==ex&&sp.y==ey)  return sp.time;
                    q.push(sp);
    }
    else
    {
     int num=isarea(xx,yy,sp.time,i);
     sp.x+=c[i];
     sp.y+=d[i];
     if(is(sp.x,sp.y)&&flag[sp.x][sp.y]==0)
     {
      flag[sp.x][sp.y]=1;
      sp.time=num;
      if(sp.x==ex&&sp.y==ey) return sp.time;
      q.push(sp);
     }
    }
   }
  }
 }
 return -1;
}
int main()
{
    int i,j;
 while(cin>>m>>n)
 {
  memset(flag,0,sizeof(flag));
  for(i=0;i<m;i++)
  {
   for(j=0;j<n;j++)
   {
    cin>>ss[i][j];
    if(ss[i][j]=='*') flag[i][j]=1;
    if(ss[i][j]=='S')  {sx=i;sy=j;}
    if(ss[i][j]=='T')  {ex=i;ey=j;}
   }
  }
  printf("%d\n",bfs());
 }
 return 0;
}

转载于:https://www.cnblogs.com/ffhuguang/archive/2013/03/12/2955775.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ruoyi接口权限校验

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

MSP430F5529 DriverLib 库函数学习笔记(八)模数转换模块(ADC12)

目录硬知识模数转换概述MSP430单片机ADC12模块介绍MSP430单片机ADC12模块操作ADC12的转换模式采样和转换转换存储器使用片内集成温度传感器ADC12模块寄存器ADC_12A API (机翻)处理初始化和转换的函数参数处理中断的函数参数处理ADC_12A的辅助功能的函数参数上机实战&#xff08…

js Cookie

javascript操作Cookie CreateTime--2017年6月2日17:15:36Author:Marydon 参考链接&#xff1a;http://www.jb51.net/article/64330.htm &#xff08;一&#xff09;介绍   JavaScript是运行在客户端的脚本&#xff0c;因此一般是不能够设置Session的&#xff0c;因为Session是…

JFreeChart API文档

JFreeChart API文档 关键字: 报表Version 1.0.0-rc2 JFreeChart目前是最好的java图形解决方案&#xff0c;基本能够解决目前的图形方面的需求&#xff0c;主要包括如下几个方面&#xff1a; JFreeChart类&#xff1a; void setAntiAlias(boolean flag)字体模糊边界 void setBac…

有意思的鼠标指针交互探究

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

php 递归创建目录、递归删除非空目录、迭代创建目录

递归创建目录 方法一 1 function mk_dir($path){2 if(is_dir($path)){  //参数本身是一个目录3 return true;4 }5 6 if(is_dir(dirname($path))){ //参数的父目录是一个目录&#xff0c;则创建目录7 return mkdir($path);8 }9 10 mk_di…

python基本数据类型——str

一、字符串的创建 test str() / "" test str("licheng") / "licheng" 无参数&#xff0c;创建空字符串一个参数&#xff0c;创建普通字符串两个参数&#xff0c;int&#xff08;字节&#xff0c;编码&#xff09;二、字符串的常用方法 #capita…

MSP430F5529 DriverLib 库函数学习笔记(九)SPI

目录硬知识USCI的同步模式SPI概述SPI特性及结构框图同步操作原理与操作USCI寄存器——SPI模式USCI_x_SPI API &#xff08;机翻&#xff09;处理状态和初始化的函数参数处理数据的函数参数管理中断的函数参数DMA相关参数平台&#xff1a;Code Composer Studio 10.3.1 MSP430F5…

轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

软件工程----9软件实现

软件实现是软件产品由概念到实体的一个关键过程。包括代码设计&#xff0c;设计审查&#xff0c;代码走查&#xff0c;代码编译和单元测试。 1 程序设计语言 应用领域&#xff0c;用户要求&#xff0c;系统兼容&#xff0c;可移植性&#xff0c;开发环境 2 软件编码规范 文件命…

深入理解Threadlocal

SUN公司早在JDK1.2的时候就为我们提供了java.lang.ThreadLocal,低版本的JDK所提供的get()返回的是Object对象&#xff0c;需要强制类型转换&#xff0c;使用起来不方便&#xff0c;而在JDK1.5引入了泛型&#xff0c;在一定程度地简化ThreadLocal的使用。 我们知道在spring容器中…

HDU 2289 几何+圆台

题意;给定一个圆台杯子的R&#xff0c;r&#xff0c;H和里面水的体积V 求h 二分。。。。。。。。。。。。。。。。。 因为解不出来h。。。。。。。。。。。。 View Code 1 /*2 几何3 圆台体积4 V1/3*pi*h*(r1*r1r2*r2r1*r2)5 6 */7 #include<stdio.h>8 #include<stri…

MSP430F5529 DriverLib 库函数学习笔记(十)SPI驱动墨水屏

目录上机实战SPI 驱动 墨水屏墨水屏介绍电子纸的分类电泳型电子纸技术详解原理结构优势与不足实验电路介绍程序分析引脚初始化SPI模块初始化发送和接收全部源代码main.cmain.h墨水屏相关Paper_Display.cPaper_Display.hInclude.h实验结果现象波形对应平台&#xff1a;Code Comp…

Xamarin开发IOS笔记:切换输入法时输入框被遮住

在进行IOS开发的过程中&#xff0c;出现类似微信朋友圈的交互界面&#xff0c;当用户遇到感兴趣的内容可以进行评论。为了方便评论输入&#xff0c;当出现评论输入框的时候自动将评论输入框移动至键盘的上方&#xff0c;这样方便边输入边查看。 当用户隐藏键盘或者切换输入法的…

技术管理进阶——你了解成长的全貌吗?

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

HDU Victor and World (最短路+状态压缩)

题目链接&#xff1a;传送门 题意&#xff1a; n个城市m条路。刚開始在点1&#xff0c;求把每一个城市都遍历一边最后回到1的花费的最小值。 分析&#xff1a; 我们首先须要预处理出随意两个国家之间的最短距离。由于数据范围非常小&#xff0c;所以直接用Floyd即可了。之后&a…

Duplicate standby database from active database

11g Release1 中引入了新的RMAN duplicate命令&#xff0c;即duplicate from active database命令。利用该命令可以更加便捷地创建Data Guard环境&#xff0c;你甚至不需要将Primary Database shutdown(整个过程中主库都可以处于打开状态下)&#xff0c;也不需要在配置前做一些…

MSP430F5529 DriverLib 库函数学习笔记(十一)I2C / IIC

目录硬知识USCI的I2C模式I2C概述MSP430单片机I2C模块特征及结构框图I2C原理I2C主从操作&#xff08;1&#xff09;从模式&#xff08;2&#xff09;主模式I2C模式下的USCI中断USCI寄存器—I2C模式I2C API (机翻)API介绍主机模式主机模式单字节传输主机模式多字节传输主机模式单…

JVM中可生成的最大Thread数量

最近想测试下Openfire下的最大并发数&#xff0c;需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少个线程一直心存疑惑&#xff0c;所以打算实际测试下&#xff0c;简单google了把&#xff0c;找到影响线程数量的因素有下面几个&#xff1a; -Xms intial java heap s…

使用 Abp.Zero 搭建第三方登录模块(一):原理篇

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…