华为OD机试真题2024版-路口最短时间问题

题目描述

假定街道是棋盘型的,每格距离相等,车辆通过每格街道需要时间均为 timePerRoad;

街道的街口(交叉点)有交通灯,灯的周期 T(=lights[row][col]) 各不相同;

车辆可直行、左转和右转,其中直行和左转需要等相应 T 时间的交通灯才可通行,右转无需等待。

现给出 n*m 个街口的交通灯周期,以及起止街口的坐标,计算车辆经过两个街口的最短时间。

其中:

1)起点和终点的交通灯不计入时间,且可以任意方向经过街口 不可超出 n*m 个街口,不可跳跃,但边线也是道路(即 lights[0][0] -> lights[0][1] 是有效路径)

入口函数定义:

/**
* lights : n*m 个街口每个交通灯的周期,值范围[0,120],n 和 m 的范围为[1,9]
* timePerRoad : 相邻两个街口之间街道的通过时间,范围为[0,600]
* rowStart : 起点的行号
* colStart : 起点的列号
* rowEnd : 终点的行号
* colEnd : 终点的列号
* return : lights[rowStart][colStart] 与 lights[rowEnd][colEnd] 两个街口之间的最短通行时间
*/
int calcTime(int[][] lights,int timePerRoad,int rowStart,int colStart,int rowEnd,int colEnd)

示例一

输入

[[1,2,3],[4,5,6],[7,8,9]],60,0,0,2,2

输出

245

说明

行走路线为 (0,0) -> (0,1) -> (1,1) -> (1,2) -> (2,2) 走了 4 格路,2 个右转,1 个左转,共耗时 60+0+60+5+60+0+60=245。

import java.util.*;public class Main {static final int MAX_SPEED = Integer.MAX_VALUE;enum Direction { UP, RIGHT, DOWN, LEFT };static class Point {int x, y, direction, speed;public Point(int x, int y, int direction, int speed) {this.x = x;this.y = y;this.direction = direction;this.speed = speed;}}static class Compare implements Comparator<Point> {public int compare(Point a, Point b) {return Integer.compare(a.speed, b.speed);}}static int calcTime(int[][] lights, int timePerRoad, int rowStart,int colStart, int rowEnd, int colEnd) {int[][][] result = new int[rowEnd + 1][colEnd + 1][4];for (int[][] row : result) {for (int[] col : row) {Arrays.fill(col, MAX_SPEED);}}PriorityQueue<Point> pq = new PriorityQueue<>(new Compare());for (int i = 0; i < 4; i++) {pq.add(new Point(rowStart, colStart, i, 0));}int[][] directions = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};while (!pq.isEmpty()) {Point p = pq.poll();if (p.speed > result[p.x][p.y][p.direction]) {continue;}for (int i = 0; i < 4; ++i) {int newDir = (p.direction + i) % 4;int newX = p.x + directions[newDir][0];int newY = p.y + directions[newDir][1];if (newX >= 0 && newX <= rowEnd && newY >= 0 && newY <= colEnd) {int newSpeed = p.speed + timePerRoad + (i != 1 ? lights[p.x][p.y] : 0);if (newSpeed < result[newX][newY][newDir]) {result[newX][newY][newDir] = newSpeed;pq.add(new Point(newX, newY, newDir, newSpeed));}}}}return Math.min(Math.min(result[rowEnd][colEnd][0], result[rowEnd][colEnd][1]),result[rowEnd][colEnd][2]);}public static void main(String[] args) {int[][] lights = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};int timePerRoad = 60;int rowStart = 0;int colStart = 0;int rowEnd = 2;int colEnd = 2;System.out.println(calcTime(lights, timePerRoad, rowStart, colStart, rowEnd, colEnd));}
}

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

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

相关文章

企业网三层架构

企业网三层架构&#xff1a;是一种层次化模型设计&#xff0c;旨在将复杂的网络设计分成三个层次&#xff0c;每个层次都着重于某些特定的功能&#xff0c;以提高效率和稳定性。 企业网三层架构层次&#xff1a; 接入层&#xff1a;使终端设备接入到网络中来&#xff0c;提供…

Python爬虫教程第二篇:进阶技巧与实战案例

Python爬虫教程第二篇&#xff1a;进阶技巧与实战案例 在上一篇教程中&#xff0c;我们学习了Python爬虫的基础概念、基本流程以及一个简单的入门实践案例。本篇教程将带领大家进一步探索Python爬虫的进阶技巧&#xff0c;并提供一个实战案例&#xff0c;帮助大家提升爬虫技能…

Android12 MultiMedia框架之GenericSource extractor

前面两节学习到了各种Source的创建和extractor service的启动&#xff0c;本节将以本地播放为例记录下GenericSource是如何创建一个extractor的。extractor是在PrepareAsync()方法中被创建出来的&#xff0c;为了不过多赘述&#xff0c;我们直接从GenericSource的onPrepareAsyn…

Mojolicious命令行工具:自动化Web开发的瑞士军刀

Mojolicious是一个高性能的、基于Perl的Web开发框架&#xff0c;它提供了一整套工具来简化Web开发流程。其中&#xff0c;Mojolicious的命令行工具集是其强大功能的一部分&#xff0c;允许开发者快速生成项目模板、运行开发服务器、执行各种开发任务等。本文将详细介绍Mojolici…

qt 自定义信号号槽 简单举例

在Qt中&#xff0c;自定义信号和槽是一种非常灵活的方式来处理对象之间的通信。以下是一个简单的例子&#xff0c;展示了如何定义和使用自定义的信号和槽。 首先&#xff0c;我们定义一个名为MyClass的类&#xff0c;该类继承自QObject&#xff0c;并声明一个自定义信号和一个…

13_Shell系统函数

13_Shell系统函数和自定义函数 一、系统函数 basename 获取文件名 #!/bin/bash#basename 相对路径文件名 basename ./1.sh#basename 绝对路径文件名 basename /tmp/1.sh#basename 去除文件后缀名 basename /tmp/1.sh .shdirname 获取文件所在目录名 #!/bin/bash#dirname 相对路…

Redis持久化RDB,AOF

目 录 CONFIG动态修改配置 慢查询 持久化 在上一篇主要对redis的了解入门&#xff0c;安装&#xff0c;以及基础配置&#xff0c;多实例的实现&#xff1a;redis的安装看我上一篇&#xff1a; Redis安装部署与使用,多实例 redis是挡在MySQL前面的&#xff0c;运行在内存…

Week 6-杨帆-学习总结

- 46 语义分割和数据集 语义分割概念 语义分割是一种计算机视觉任务&#xff0c;其目标是将图像分割成属于不同语义类别的区域。与目标检测不同&#xff0c;语义分割关注的是像素级别的标注和预测&#xff0c;能够识别并理解图像中每一个像素的内容。这使得语义分割在理解图像…

产品经理-研发流程-敏捷开发-迭代-需求评审及产品规划(15)

敏捷开发是以用户的需求进化为核心&#xff0c;采用迭代、循序渐进的方法进行软件开发。 通俗来说&#xff0c;敏捷开发是一个软件开发流程&#xff0c;是一个采用了迭代方法的开发流程 简单来说&#xff0c;迭代就是把一个大产品拆分出一些最小的实现单位。完成不同的迭代就最…

机器学习筑基篇,Jupyter Notebook 精简指南

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 Jupyter Notebook 简明指南 描述&#xff1a;前面我们已经在机器学习工作站&#xff08;Ubuntu 24.04 Desktop Geforce RTX 4070Ti SUPER&#xff09;中安装 Anaconda 工具包&#xff0c;其…

老物件线上3D回忆展拓宽了艺术作品的展示空间和时间-深圳华锐视点

在数字技术的浪潮下&#xff0c;3D线上画展为艺术家们开启了一个全新的展示与销售平台。这一创新形式不仅拓宽了艺术作品的展示空间&#xff0c;还为广大观众带来了前所未有的观赏体验。 3D线上画展制作以其独特的互动性&#xff0c;让艺术不再是单一的视觉享受。在这里&#x…

数据处理-Matplotlib 绘图展示

文章目录 1. Matplotlib 简介2. 安装3. Matplotlib Pyplot4. 绘制图表1. 折线图2. 散点图3. 柱状图4. 饼图5. 直方图 5. 中文显示 1. Matplotlib 简介 Matplotlib 是 Python 的绘图库&#xff0c;它能让使用者很轻松地将数据图形化&#xff0c;并且提供多样化的输出格式。 Ma…

如何定义版本号--语义化版本

前言 版本号(version number)是版本的标识号。每一个操作系统&#xff08;或广义的讲&#xff0c;每一个软件&#xff09;都有一个版本号。版本号能使用户了解所使用的操作系统是否为最新的版本以及它所提供的功能与设施。 例如在Python项目依赖中会看到 requires-python &q…

zdppy+onlyoffice实现重命名文件的功能

参考文档&#xff1a;https://api.onlyoffice.com/zh/editors/rename 步骤图&#xff1a; 实现步骤&#xff1a; 用户在 文档编辑器中为文档指定一个新名称。 文档编辑器 将文档的新名称通知给 文档管理器。 文档管理器 将文档的新名称发送到 文档存储服务&#xff0c;在这里…

使用jsencrypt在web前端对字符串进行Ras加密

话不多说&#xff0c;上代码 实例代码 下面方法&#xff0c;在网页中先引入jsencrypt.min.js。然后调用ToEncrypt方法示例输出加密&#xff0c;解密后的结果。 <script src"/js/jsencrypt.min.js"></script> //加密测试function ToEncrypt(){// 假设…

synchronized关键字详解

文章目录 synchronized使用示例实现原理锁的升级synchronized与可见性synchronized与原子性synchronized与有序性 synchronized synchronized是Java提供的关键字译为同步&#xff0c;是Java中用于实现线程同步的一种机制。它可以确保在同一时间只有一个线程能够执行某段代码&a…

【Python系列】数字的bool值

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

泌尿系统疾病病人的护理

一、泌尿系统疾病病人的一般护理要点 对于泌尿系统疾病的病人&#xff0c;护理是至关重要的。首先&#xff0c;要密切观察病人的生命体征&#xff0c;包括体温、脉搏、呼吸和血压。 饮食方面&#xff0c;应根据病人的具体病情进行调整。例如&#xff0c;对于有水肿的病人&#…

js登陆验证

当开始制作网页时&#xff0c;就需要做一个判断&#xff0c;不管在第几页进入&#xff0c;都要加一个登陆验证&#xff0c;只有用户有账号&#xff0c;才能进入网页&#xff0c;浏览网页信息。下面就来看一下&#xff0c;使用JavaScript几行代码实现登陆验证。 首先 登录页是i…

vue父组件样式穿透修改子组件样式

在 Vue 中&#xff0c;使用父组件样式穿透到子组件通常不推荐&#xff0c;因为它破坏了样式的作用域隔离&#xff0c;但如果你确实需要这样做&#xff0c;可以使用深度选择器。Vue 2 使用 ::v-deep&#xff0c;而 Vue 3 使用 /deep/ 或 ::v-deep 都可以。 以下是使用深度选择器…