题目: http://pipioj.online/problem.php?id=1100

题目描述:PIPI准备去升华楼的404自习室上晚自习,但是他发现某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.
PIPI发现对他来说很难找到能使得他最快自习室的路线,胖虎能够帮帮PIPI吗?
注: PIPI只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且PIPI登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,PIPI从来不在楼梯上停留。并且每次楼梯都恰好在PIPI移动完毕以后才改变方向.

输入
测试数据有多组。
对于每组测试用例:
第一行有两个数,M和N。
接下来是一个M行N列的地图,'*‘表示障碍物,’.‘表示走廊,’|‘或者’-‘表示一个楼梯。’|‘表示的楼梯在最开始是竖直方向,’-'表示的楼梯在一开始是水平方向.
地图中还有一个’S’是PIPI的起点,‘T’是自习室的位置,0<=M,N<=20,地图中不会出现两个相连的梯子.PIPI每秒只能停留在’.'或’S’和’T’所标记的格子内.

输出
对于每组测试用例,输出仅一行,包含一个数T,表示到达目标的最短时间.如果到达不了目标,输出-1.

样例输入**样例输出 **:7

#include <bits/stdc++.h>
using namespace std;
typedef struct node
{int x,y,time;
}node;
char mg[30][30];
int bfs(int x1,int y1,int x2,int y2);
int vis[30][30];
int getp(int time ,char ti);
int mov(int x, int y);
int main()
{int hang,lie;int x1,y1,x2,y2; //x1y1:起始点坐标 ; x2y2:终点坐标while(cin>>hang){cin>>lie;for(int i=0;i<=hang+1;i++){mg[i][0] = '*';mg[i][lie+1] = '*';}for(int i=0;i<=lie+1;i++){mg[0][i] = '*';mg[hang+1][i] = '*';}for(int i=1;i<=hang;i++)for(int j=1;j<=lie;j++){cin>>mg[i][j];if(mg[i][j]=='S'){x1 = i;y1 = j;}if(mg[i][j]=='T'){x2 = i;y2 = j;mg[i][j]='.';}}if(x1==x2 && y1==y2){cout<<"0"<<endl;continue;}cout<<bfs(x1,y1,x2,y2)<<endl;}
}
//梯子处理方法:如果此时梯子是正的,那就当超级走廊处理;如果梯子是斜的,那就push一个top.time+1的节点进队列等待;
int bfs(int x1,int y1,int x2,int y2)
{memset(vis,0,sizeof(vis));queue <node> q;q.push({x1,y1,0});int dir[][2] ={{-1,0},{1,0},{0,1},{0,-1}};vis[x1][y1] = 1;while(!q.empty()){node top = q.front();//cout<<top.x<<" "<<top.y<<" "<<top.time<<endl;q.pop();if(top.x == x2 && top.y == y2) return top.time;int nx,ny,nt;for(int i=0;i<4;i++){nx = top.x + dir[i][0];ny = top.y + dir[i][1];nt = top.time + 1;if(mg[nx][ny]=='.'&&vis[nx][ny]==0){q.push({nx,ny,nt});vis[nx][ny]= 1;}else if(mg[nx][ny]=='|' || mg [nx][ny]=='-')//x代表行 , y代表列{int gue = getp(top.time,mg[nx][ny]);  //1表示 ‘|’ , 0 表示 ‘-’int pos = mov(dir[i][0],dir[i][1]);  //1表示上下移动时碰到梯子, 0 ...nx = nx + dir[i][0];//在原来基础上再走一步ny = ny + dir[i][1];if(mg[nx][ny]=='.'&&vis[nx][ny]==0)//下个点有讨论价值{if(gue ==1){if(pos == 1){q.push({nx,ny,nt});vis[nx][ny]=1;}else q.push({top.x,top.y,nt});}else if(gue ==0){if(pos==0){q.push({nx,ny,nt});vis[nx][ny]=1;}else q.push({top.x,top.y,nt});}}}}}return -1;
}
/*
3 3
*.T
.|.
S.*
*/
int getp(int time ,char ti)
{if(ti=='|'){if(time%2==0) return 1;else return 0;}else if(ti == '-'){if(time%2==0) return 0;else return 1;}
}int mov(int x, int y)
{if(x==0)return 0;if(y==0)return 1;
}

PPOJ1100: 诡异的楼梯相关推荐

  1. HDU 1180 诡异的楼梯

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

  2. HDU 1180 诡异的楼梯

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

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

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

  4. 【算法设计与分析】HDU-1108 C++诡异的楼梯(BFS迷宫最短路径)

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

  5. 诡异的楼梯 bfs

    诡异的楼梯 原题链接https://vjudge.net/contest/345248#problem/M 由题意可知,题目大概还是一个迷宫问题,大概思路不变,但是需要增加情况,对于到楼梯前的时候我们 ...

  6. hdu1180 诡异的楼梯(BFS+优先队列)

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

  7. hdu 诡异的楼梯(BFS)

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

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

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

  9. 杭电1180java实现(bfs)

    诡异的楼梯: 多组数据输入M N,表示大小然后输入地图.*表示墙壁,'.'表示可以通过,S初始,T结尾位置,'-','|'代表初始楼梯状况,每隔一秒就会换成对方.-左右走,跳过楼梯,|上下走,跳过楼梯 ...

最新文章

  1. java poi jar maven_导出maven项目依赖的jar包(图文教程)
  2. python模拟鼠标拖动滑块_如何通过拖动滑块来控制Kivy滚动视图?
  3. 前端学习(2681):重读vue电商网站1之后台启动
  4. python松天笔记200304
  5. 利用wcf传递字节的简单例子
  6. Atitit mybatisutil 模块测试功能列表 1.1. mybatis读取mapper配置的sql语句 使用xml类库 1 1.2. Mybatis替换参数工具类型 3 Itfs pn
  7. CenterCrop图像裁剪原理
  8. AEJoy —— 介绍神奇的 10 个 AE 表达式附带 2 种简单的调试方法
  9. [论文阅读] 激光点云分割-RPVNet
  10. matlab 汽车 仿真,MATLAB编程与汽车仿真应用
  11. 西数trex自动版u盘版_当移动硬盘遇上它,改变生活:西数My Passport随行版
  12. 360 linux 杀毒,360主机卫士Linux后门专杀版
  13. C5750X7R2E105K230KA(电容器)MSP430F5249IRGCR微控制器资料
  14. 仅限中国:AMD推出Radeon RX 560 XT
  15. fiyme android底层,魅族首批Android 10底层Flyme于今日正式推送
  16. 【数字信号】基于matlab GUI DTMF电话模拟系统(频谱图+时域图+语谱图)【含Matlab源码 2092期】
  17. 对于position定位的认识
  18. ApacheCN×Tesra 免费算力申请活动
  19. Android 扫描、生成、识别二维码、条码 一库搞定
  20. MySQL - 03DDL之数据表

热门文章

  1. sinr是什么意思_信噪比有负的吗?表示什么意思?
  2. 连接到另外计算机要用户名,连接局域网电脑需要用户名密码
  3. java俄罗斯方块消除算法_Java 俄罗斯方块消行算法
  4. 明明是那么好的人,却又是那么伤人的人
  5. Android 11 内置原生壁纸!速度来取
  6. 购买30万住房也能落户武汉
  7. 详细安装系统镜像Contos图解和常用命令
  8. Linux中常用的文件目录,Linux学习笔记2——Linux中常用文件目录操作命令
  9. RSS阅读服务上线啦
  10. 金手指(通达信公式 主图 源码 测试图)箱底 箱顶 短趋势线 中趋势线 压力位 支撑位