一、题目描述

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

样例地图如下:

二、设计思路

本题目是经典使用BFS求迷宫最短路径的问题,首先创建一个结构体来分别存储每个坐标点和相应点对应的步数,再创建有一个方向二维数组来控制进行上、下、左、右移动。因为题目中还有一个小小的变化即里面的一个或多个坐标点会随着时间的变化让你只能上下这样走或者左右这样走,我们就得记录这样的梯子状态,规则如下:

如果一开始是竖的,即’|’,那么奇数次后就是横的,偶数次后还是原来的状态,横着的话同理。

所以我们记录一个数组jump[][],第一个里面放’|’OR’-’,第二个里面放1或者0。例如,一开始是’|’,我们到第三步还是’|’,因为3%2=1。即:

jump['-'][0] = jump['|'][1] = 1;
jump['-'][1] = jump['|'][0] = 2;

然后再bfs,在队列中取出一个坐标,pop后再把周围能走的push进去即可。到达目标位置就可以输出答案了。这里为什么不用判断是不是最小呢,因为我最先到达的就肯定是最小了的,不用特意每个min一下。

数据结构:数组、结构体、队列

时间复杂度:O(n*m)

如果要输出路径,参考:BFS最短路径的两种打印方法_罗勇军的博客-CSDN博客_bfs最短路径

三、代码

#include<bits/stdc++.h>
using namespace std;
struct node {int x,y,step;//记录当前坐标和时间node(int x = 0,int y = 0,int step = 0)//结构体构造函数 :x(x),y(y),step(step) {}
};
int n,m;
int step[4][2] = {//方向控制 {-1,0},//上{1,0},//下{0,-1},//左{0,1},//右
};
char grid[30][30];//记录地图
int vis[30][30];//记录是否走过
int jump[300][2];//记录梯子状态
int check(int x,int y){//检查函数if(x < 0 || x >= n)return 0;if(y < 0 || y >= m)return 0;if(vis[x][y])return 0;return 1;
}
int bfs() {node now,nex;queue<node> que;for(int i=0;i<n;++i){//遍历整个地图for(int j=0;j<m;++j){if(grid[i][j] == '*') vis[i][j] = 1;else if(grid[i][j] == 'S') now = node(i,j);//记录起点}}vis[now.x][now.y] = 1;//起点设置为走过que.push(now);while(!que.empty()){now = que.front();que.pop();if(grid[now.x][now.y] == 'T')return now.step;//到达终点就返回当前步数for(int i=0;i<4;++i){nex.x = now.x + step[i][0];//往当前方向走一步nex.y = now.y + step[i][1];//往当前方向走一步nex.step = now.step;//先获取当前步数用来判断if(!check(nex.x,nex.y))continue;//如果不能走就跳过int flag = jump[grid[nex.x][nex.y]][nex.step&1];//用当前格子和时间的奇偶来判断梯子方向if(flag){//如果flag大于0意味着当前站在梯子上if((flag == 1 && i >= 2 ) || (flag == 2 && i <= 1)){//如果与梯子方向相同nex.x += step[i][0];//继续往前走一步nex.y += step[i][1];//继续往前走一步if(!check(nex.x,nex.y))continue;//如果梯子后不能走就跳过}else nex = now;//如果与梯子方向不同,就原地等待}vis[nex.x][nex.y] = 1;//标记此次目的地被走过nex.step += 1;//时间增加que.push(nex);//入队}}return 0;//无法走到目标
}
int main() {jump['-'][0] = jump['|'][1] = 1;//'-' 与 偶数时间 = '|'与奇数时间 = 横向移动jump['-'][1] = jump['|'][0] = 2;//'-' 与 奇数时间 = '|'与偶数时间 = 竖向移动while(cin>>n>>m){//循环输入到文件尾memset(vis,0,sizeof(vis));for(int i=0;i<n;i++){for(int j=1;j<m;j++){scanf("%s",grid[i]);//输入地图}}printf("%d\n",bfs());//输出bfs答案}return 0;
}

参考博客:HDU1180 诡异的楼梯(bfs)[C,C++]_扶她小藜的博客-CSDN博客

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

  1. 算法设计与分析课程的时间空间复杂度

    算法设计与分析课程的时间空间复杂度: 总结 算法 时间复杂度 空间复杂度 说明 Hanoi $ O(2^n) $ $ O(n) $ 递归使用 会场安排问题 \(O(nlogn)\) \(O(n)\) ...

  2. 哈工大威海算法设计与分析_计算机算法设计与分析第一章 算法概述

    晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...

  3. PHP第五周答案,算法设计与分析第五周作业——Word Ladder

    算法设计与分析第五周作业--Word Ladder 上周找了一道深度搜索优先搜索的算法题来做,于是这周就选了一道广度优先搜索算法题来试试手. 本周所选题目:原题目链接 题目详情 题目大意:给出一个字符 ...

  4. 太原理工大学linux与python编程r实验报告_太原理工大学算法设计与分析实验报告...

    <太原理工大学算法设计与分析实验报告>由会员分享,可在线阅读,更多相关<太原理工大学算法设计与分析实验报告(12页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: ...

  5. 算法设计与分析——算法思想总结

    算法设计与分析 1.分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归的解这些子问题,然后将各子问题的解合并得到原问题的解. 分治法所能解 ...

  6. 算法设计与分析——递归与分治策略——全排列

    算法设计与分析--递归与分治策略--全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位,如果递归到了最后一位,则输出他当前的全排列序列. 如果没有到达最后一位,则循环的 ...

  7. 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案

    <计算机算法设计与分析>习题及答案 一.选择题 1.二分搜索算法是利用( A )实现的算法. A.分治策略 B.动态规划法 C.贪心法 D.回溯法 2.下列不是动态规划算法基本步骤的是( ...

  8. 0x08算法设计与分析复习(二):算法设计策略-回溯法2

    参考书籍:算法设计与分析--C++语言描述(第二版) 算法设计策略-回溯法 子集和数 问题描述 已知n个不同的正数wi(0≤i≤n−1)的集合,求该集合的所有满足条件的子集,使得每个子集中的正数之和等 ...

  9. 【算法设计与分析】16 分治策略:快速排序(快速排序的时间复杂度计算)

    上一篇文章学习了:[算法设计与分析]15 分治策略:芯片测试 文章目录 1. 快速排序的基本思想 1.2 时间复杂度的计算 1.21 最坏情况时间复杂度计算 1.22 最好情况时间复杂度 1.23 平 ...

最新文章

  1. linux安装识别硬盘比raid小,如何判断linux使用的是HDD还是SSD、HHD;磁盘阵列RAID
  2. 学习如何用自己的 appender 来扩展 log4j 框架
  3. java如何实现乌龟爬行_乌龟是怎样爬行的
  4. 10 个超炫酷后台控制面板(附 GitHub下载链接)
  5. 《架构之美》阅读笔记01
  6. c#endread怎么打印出来_打印机打印出来是白板是怎么回事
  7. View绘制--onMeasure() 、onLayout()
  8. C# 数组增加元素_C#的集合类型及使用技巧
  9. 掉入陷阱的数字 (15 分)
  10. webApplicationContext 与servletContext
  11. 眼压高学计算机行吗,为什么眼压高到降不下,医生却说没问题?
  12. 拓端tecdat|R语言混合正态分布极大似然估计和EM算法
  13. Mybatis 返回Map数据
  14. 10款免费的电路设计软件,你用过几个?
  15. c盘清理代码_WIN10 C盘空间不够怎么办?几个小方法助你清理硬盘空间
  16. 昆仑通态触摸屏如何把参数由触摸屏传递到PLC_昆仑通态触摸屏的串口232通讯功能-----有谁用过?...
  17. office 2021安装教程+下载
  18. 国家计算机机房地址,国家电子计算机机房设计规范..doc
  19. Matlab求解线性方程组Ax=b
  20. Move语言:我眼中的 Libra 最大亮点

热门文章

  1. 电脑剪切后丢失的文件怎么恢复
  2. 上手评测:华为nova8和nova7Pro哪个好?区别是什么
  3. Navicat绘制数据库物理模型
  4. Java时间轮算法的实现
  5. 微信小程序 - - 授权登录退出和缓存
  6. 现代服务业行业税收筹划,信息技术公司节税方案
  7. uniapp消息推送(个推-PHP服务端推送)
  8. 【AWS云从业者基础知识笔记】——模块4:网络
  9. API接口管理平台eoLinker-AMS V3.2.0
  10. 2021B站1024程序员节 网络攻防CTF