LCP 56. 信物传送

简介: 🎈每天进行一道算法题目练习,今天的题目是“LCP 56. 信物传送”,让我们一起来温习一下寻路算法。

说在前面

🎈每天进行一道算法题目练习,今天的题目是“LCP 56. 信物传送”,让我们一起来温习一下寻路算法。

问题描述

欢迎各位勇者来到力扣城,本次试炼主题为「信物传送」。

本次试炼场地设有若干传送带,matrixi 表示第 i 行 j 列的传送带运作方向,"^","v","<",">" 这四种符号分别表示 上、下、左、右 四个方向。信物会随传送带的方向移动。勇者每一次施法操作,可临时变更一处传送带的方向,在物品经过后传送带恢复原方向。

image.png
通关信物初始位于坐标 start处,勇者需要将其移动到坐标 end 处,请返回勇者施法操作的最少次数。

注意:

start 和 end 的格式均为 [i,j]

示例 1:

输入:matrix = [">>v","v^<","<><"], start = [0,1], end = [2,0]
输出:1
解释:
如上图所示
当信物移动到 [1,1] 时,勇者施法一次将 [1,1] 的传送方向 ^ 从变更为 <
从而信物移动到 [1,0],后续到达 end 位置
因此勇者最少需要施法操作 1 次

示例 2:

输入:matrix = [">>v",">>v","^<<"], start = [0,0], end = [1,1]
输出:0
解释:勇者无需施法,信物将自动传送至 end 位置

示例 3:

输入:matrix = [">^^>","<^v>","^v^<"], start = [0,0], end = [1,3]
输出:3

提示:

matrix 中仅包含 '^'、'v'、'<'、'>'
0 < matrix.length <= 100
0 < matrix[i].length <= 100
0 <= start[0],end[0] < matrix.length
0 <= start[1],end[1] < matrix[i].length

思路分析

这是一道地图的寻路问题,对于这种问题我们可以使用dfs(深度优先搜索算法)和bfs(广度优先搜索算法)来进行解题。本题中我使用了记忆化的dfs深度优先搜索算法来进行解题。\
题目的意思是地图的每一块地方都有一个传送带,我们可以顺着传送带去到下一个方块,并且我们可以改变传送带的方向,现在要我们计算从起点到终点,我们需要修改传送带方向的数量。\

定义遍历的四个方向

首先需要设定遍历的方向

let dx = [0, 1, 0, -1],
    dy = [1, 0, -1, 0];

记录到达当前位置的最小步数

需要记录到达每一个方块最小步数,当遍历到比当前需要的步数还多时,我们就不需要继续往下遍历了。

let flag = new Array(matrix.length);
for (let i = 0; i < flag.length; i++) {
    flag[i] = new Array(matrix[0].length).fill(Infinity);
}
flag[x][y] = Math.min(flag[x][y], step);
if (flag[x][y] <= step) {
  return;
}

判断是否需要改变方向

当前遍历的方向与传送带的方向不一致时,需要改变传送带方向。

let judge = function (str, i) {
    if (i == 0 && str == ">") return 0;
    if (i == 1 && str == "v") return 0;
    if (i == 2 && str == "<") return 0;
    if (i == 3 && str == "^") return 0;
    return 1;
};

到达终点时更新最少步数

if (x == end[0] && y == end[1]) {
  res = Math.min(res, step);
  return;
}

AC代码

/**
 * @param {string[]} matrix
 * @param {number[]} start
 * @param {number[]} end
 * @return {number}
 */
var conveyorBelt = function (matrix, start, end) {
  let dx = [0, 1, 0, -1],
    dy = [1, 0, -1, 0];
  let flag = new Array(matrix.length);
  for (let i = 0; i < flag.length; i++) {
    flag[i] = new Array(matrix[0].length).fill(Infinity);
  }
  let res = Infinity;
  let judge = function (str, i) {
    if (i == 0 && str == ">") return 0;
    if (i == 1 && str == "v") return 0;
    if (i == 2 && str == "<") return 0;
    if (i == 3 && str == "^") return 0;
    return 1;
  };
  let dfs = function (x, y, step) {
    if (
      x < 0 ||
      y < 0 ||
      x >= matrix.length ||
      y >= matrix[0].length ||
      res == 0 ||
      flag[x][y] <= step
    ) {
      return;
    }
    if (x == end[0] && y == end[1]) {
      res = Math.min(res, step);
      return;
    }
    for (let i = 0; i < 4; i++) {
      if (res == 0) return;
      let j = judge(matrix[x][y], i);
      flag[x][y] = Math.min(flag[x][y], step);
      dfs(x + dx[i], y + dy[i], step + j);
      if (res == 0) return;
    }
  };
  dfs(start[0], start[1], 0);
  return res;
};

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
运维 监控 安全
调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
457 0
QGS
(linux-x86-arm)银河麒麟V10安装ToDesk远程控制
记(linux-x86-arm)银河麒麟V10安装ToDesk远程控制
QGS
5025 0
(linux-x86-arm)银河麒麟V10安装ToDesk远程控制
|
1月前
|
人工智能 算法 搜索推荐
优化RAG检索:别只关注模型,关键在于这三方面!
本文从测试开发视角,解析RAG检索模块的五大优化方向:向量化模型、文本分块、检索参数、混合检索及知识库更新。通过建立自动化评测基线与回归验证体系,确保优化效果可量化、可追溯,让测试成为RAG系统迭代的关键支撑。
|
监控 前端开发 网络协议
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(5)-Fiddler监控面板详解
【2月更文挑战第7天】《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(5)-Fiddler监控面板详解 按照从上往下,从左往右的计划,今天就轮到介绍和分享Fiddler的监控面板了。监控面板主要是一些辅助标签工具栏。有了这些就会让你的会话请求和响应时刻处监控中毫无隐私可言。监控面板是fiddler最核心的功能之一。记录了来自于服务器端(webServer)的请求会话。包括页面的请求和静态文件的请求。状态面板主要显示的是会话及会话的状态。位于软件界面右边的这一大块面板,即为辅助标签 + 工具,宏哥称之为监控。
450 0
|
安全 编译器 程序员
全面解析C++11新特性:现代编程的新起点(上)
全面解析C++11新特性:现代编程的新起点
全面解析C++11新特性:现代编程的新起点(上)
|
Shell 网络安全 开发工具
fatal: unable to access 'https://github.com/wolfcw/libfaketime.git/': Encountered end of file
fatal: unable to access 'https://github.com/wolfcw/libfaketime.git/': Encountered end of file
|
算法 Java Sentinel
限流算法(计数器、滑动时间窗口、漏斗、令牌)原理以及代码实现
> 本文会对这4个限流算法进行详细说明,并输出实现限流算法的代码示例。 > 代码是按照自己的理解写的,很简单的实现了功能,还请大佬们多多交流找bug。
2014 0
|
存储 算法 搜索推荐
Acwing862. 三元组排序
Acwing862. 三元组排序
|
监控 前端开发 Java
基于Springboot外卖系统07:员工分页查询+ 分页插件配置+分页代码实现
在分页查询页面中, 以分页的方式来展示列表数据,以及查询条件 "员工姓名"。
482 0