PPOJ1100: 诡异的楼梯
题目: 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: 诡异的楼梯相关推荐
- HDU 1180 诡异的楼梯
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Sub ...
- HDU 1180 诡异的楼梯
诡异的楼梯 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total Submis ...
- HDU 1180 诡异的楼梯(超级经典的bfs之一,需多回顾)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1180 诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) ...
- 【算法设计与分析】HDU-1108 C++诡异的楼梯(BFS迷宫最短路径)
一.题目描述 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里 ...
- 诡异的楼梯 bfs
诡异的楼梯 原题链接https://vjudge.net/contest/345248#problem/M 由题意可知,题目大概还是一个迷宫问题,大概思路不变,但是需要增加情况,对于到楼梯前的时候我们 ...
- hdu1180 诡异的楼梯(BFS+优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1180 诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 诡异的楼梯(BFS)
诡异的楼梯 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里 ...
- HDOJ/HDU 1180 诡异的楼梯(经典BFS-详解)
Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在 ...
- 杭电1180java实现(bfs)
诡异的楼梯: 多组数据输入M N,表示大小然后输入地图.*表示墙壁,'.'表示可以通过,S初始,T结尾位置,'-','|'代表初始楼梯状况,每隔一秒就会换成对方.-左右走,跳过楼梯,|上下走,跳过楼梯 ...
最新文章
- java poi jar maven_导出maven项目依赖的jar包(图文教程)
- python模拟鼠标拖动滑块_如何通过拖动滑块来控制Kivy滚动视图?
- 前端学习(2681):重读vue电商网站1之后台启动
- python松天笔记200304
- 利用wcf传递字节的简单例子
- Atitit mybatisutil 模块测试功能列表 1.1. mybatis读取mapper配置的sql语句 使用xml类库	1 1.2. Mybatis替换参数工具类型	3 Itfs pn
- CenterCrop图像裁剪原理
- AEJoy —— 介绍神奇的 10 个 AE 表达式附带 2 种简单的调试方法
- [论文阅读] 激光点云分割-RPVNet
- matlab 汽车 仿真,MATLAB编程与汽车仿真应用
- 西数trex自动版u盘版_当移动硬盘遇上它,改变生活:西数My Passport随行版
- 360 linux 杀毒,360主机卫士Linux后门专杀版
- C5750X7R2E105K230KA(电容器)MSP430F5249IRGCR微控制器资料
- 仅限中国:AMD推出Radeon RX 560 XT
- fiyme android底层,魅族首批Android 10底层Flyme于今日正式推送
- 【数字信号】基于matlab GUI DTMF电话模拟系统(频谱图+时域图+语谱图)【含Matlab源码 2092期】
- 对于position定位的认识
- ApacheCN×Tesra 免费算力申请活动
- Android 扫描、生成、识别二维码、条码 一库搞定
- MySQL - 03DDL之数据表