华为OD(C卷,200分)- 智能驾驶

news2024/9/22 0:59:40

(C卷,200分)- 智能驾驶

题目描述

有一辆汽车需要从 m * n 的地图左上角(起点)开往地图的右下角(终点),去往每一个地区都需要消耗一定的油量,加油站可进行加油。
请你计算汽车确保从从起点到达终点时所需的最少初始油量。
说明:
智能汽车可以上下左右四个方向移动
地图上的数字取值是 0 或 -1 或 正整数:
-1 :表示加油站,可以加满油,汽车的油箱容量最大为100;
0 :表示这个地区是障碍物,汽车不能通过
正整数:表示汽车走过这个地区的耗油量
如果汽车无论如何都无法到达终点,则返回 -1

输入描述

第一行为两个数字,M,N,表示地图的大小为 M * N
0 < M,N ≤ 200
后面一个 M * N 的矩阵,其中的值是 0 或 -1 或正整数,加油站的总数不超过 200 个

输出描述

如果汽车无论如何都无法到达终点,则返回 -1
如果汽车可以到达终点,则返回最少的初始油量

用例

输入 2,2
10,20
30,40
输出 70
说明 行走的路线为:右→下

输入 4,4
10,30,30,20
30,30,-1,10
0,20,20,40
10,-1,30,40
输出 70
说明 行走的路线为:右→右→下→下→下→右

输入 4,5
10,0,30,-1,10
30,0,20,0,20
10,0,10,0,30
10,-1,30,0,10
输出 60
说明 行走的路线为:下→下→下→右→右→上→上→上→右→右→下→下→下

输入 4,4
10,30,30,20
30,30,20,10
10,20,10,40
10,20,30,40
输出 -1
说明 无论如何都无法到达终点

题目解析

用例1路径
在这里插入图片描述

用例2路径
在这里插入图片描述
用例3路径
在这里插入图片描述
用例4:
由于汽车油箱容量最大100,因此即使初始时加满了油,也无法找到一条路径从起点到达终点
特殊例子
3,3
10,-1,40
30,0,50
50,-1,40
路线图如下,先走红色箭头路线,之后走绿色箭头
在这里插入图片描述
按照上面路线,初始只需要10个油即能完成从左上角开往右下角。
上面这种行驶路线我理解是可行的,也是符合本题要求的,同时也是符合实际生活场景的(车子快没油了,肯定是优先找一个就近的加油站先加油,即使加油站不在规划的路线上)。

代码思路

主要通过以下几个步骤来计算汽车使用的最小汽油量:

  1. 初始化起点位置的状态:

    • 如果起点位置是加油站,则初始油量为 0,剩余油量为 100,标记为已加油。
    • 如果起点位置不是加油站,则初始油量为该位置的油耗值,剩余油量为 0,标记为未加油。
  2. 在 BFS 过程中,对于每个新探索到的位置,计算从当前位置到达该位置所需的最小初始油量和剩余油量:

    • 如果该位置是加油站,则将剩余油量设为 100,并标记为已加油。
    • 如果该位置不是加油站,则从当前剩余油量中扣除该位置的油耗值。
    • 如果扣除后剩余油量为负数,且之前未加过油,则需要从初始油量中"借"油,即初始油量需要增加 (-remain) 的值。
    • 如果初始油量超过 100,则说明无法到达该位置,需要放弃探索。
  3. 在更新每个位置的最小初始油量和最大剩余油量时,会比较当前路径的状态和之前记录的最优状态:

    • 如果当前路径的初始油量更少,或者初始油量相同但剩余油量更多,则更新为当前路径的状态。
  4. 最终,dist_init[m-1][n-1] 就是从起点到达终点所需的最小初始油量。如果无法到达终点,则返回 -1。

总的来说,这个算法通过 BFS 的方式,动态地计算从起点到达每个位置所需的最小初始油量和最大剩余油量,并选择最优路径。遇到加油站时,会将剩余油量补充到满油状态。这样可以确保从起点到终点使用的汽油量是最小的。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define MAX_SIZE 200
typedef struct {
   
    int x; // 位置横坐标
    int y; // 位置纵坐标
    int init; // 到达此位置所需的最少初始油量
    int remain; // 到达此位置时剩余可用油量
    int flag; // 到达此位置前有没有加过油
} Node;

// m * n 的地图
int m, n;
// 地图矩阵
int matrix[MAX_SIZE][MAX_SIZE];

// 上下左右四个方向对应的偏移量
int offsets[4][2] = {
   {
   -1, 0},
                     {
   <

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

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

相关文章

Monaco Editor组件使用详解

Monaco Editor 是由微软开发并开源的一款代码编辑器&#xff0c;它是 Visual Studio Code&#xff08;VS Code&#xff09;的核心部分。Monaco Editor 提供了丰富的特性&#xff0c;包括语法高亮、代码折叠、代码提示&#xff08;IntelliSense&#xff09;、多光标选择、搜索和…

RabbitMQ消息队列总结

RabbitMQ那些事 参考一. `RabbitMQ`介绍1.1 Java工程师1.1.1 RabbitMQ学习目标1.1.2 消息队列介绍1.1.3 RabbitMQ介绍各自属性介绍(❤❤❤)二. `RabbitMQ`安装1. 基于Linux1.1 安装1.2 常用命令1.3 后台管理开启与面板介绍三. 客户端`SDK`操作(❤❤了解)1. 客户端依赖1. 生产者…

【区块链+金融服务】中国银联区块链可信存证服务 | FISCO BCOS应用案例

随着金融行业信息化的快速推进&#xff0c;“互联网 金融”业务产生了海量的电子数据。例如&#xff0c;截止到 2022 年第二季度&#xff0c; 全国累计信用卡发卡数量约 8.07 亿张&#xff0c;累计银行卡应偿信贷余额为 8.66 万亿元&#xff0c;累计信用卡逾期半年未尝信贷 总…

18124 N皇后问题

### 详细分析 这是一个经典的N皇后问题。我们需要在N\*N的棋盘上放置N个皇后&#xff0c;使得任意两个皇后不在同一行、同一列或同一对角线上。可以使用回溯算法来解决这个问题。 ### 伪代码 1. 定义一个函数countSolutions&#xff0c;输入为N&#xff0c;输出为N皇后问题的解…

尚硅谷MYSQL(5-6章)

排序和分页 排序 如果没有使用排序操作的话 查询出来的数据是按添加的顺序排序的 ORDER BY是来进行排序的 后面可以添加ASC升序 DESC降序 如果后面没有显示指明排序的方式的话 则默认按照升序排序 where中不能使用列的别名 我们在使用sql语句的时候 她的执行顺序不是从第一…

Python 环境搭建指南 超详细

Python是由荷兰⼈吉多范罗苏姆&#xff08;Guido von Rossum&#xff0c;后⾯都称呼他为Guido&#xff09;发明的⼀种编程语言 1. 1989年圣诞节&#xff1a;Guido开始写Python语⾔的编译器。2. 1991年2⽉&#xff1a;第⼀个Python解释器诞⽣&#xff0c;它是⽤C语⾔实现的&…

STM32之点亮LED灯

使用固件库实现LED点灯 LED灯&#xff1a; LED灯&#xff0c;是一种能够将电能转化为可见光的半导体器件 控制LED灯&#xff1a; LED灯的正极接到了3.3V&#xff0c;LED灯的负极接到了PA1&#xff0c;也就是GPIOA1引脚 只需要控制PA1为相对应的低电平&#xff0c;即可点亮对…

政务大数据解决方案(十)

政务大数据解决方案通过建立全面的集成数据平台&#xff0c;整合来自各政府部门的异构数据&#xff0c;运用大数据分析、人工智能和机器学习技术对数据进行深度挖掘与智能化处理&#xff0c;提供实时精准的决策支持&#xff0c;从而提升政策制定和实施的科学性与效率。该方案包…

retrofit+livedata+viewModel+moshi处理数据

1.从源码角度看&#xff0c;只需要定义一个CallAdapterFactory 处理结果livedata接受默认的CallAdapterFactory 是DefaultCallAdapterFactory // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) //package retrofit2;i…

那不勒斯足球俱乐部在 The Sandbox 中启动

访问 The Sandbox 中的那不勒斯足球俱乐部快闪商店&#xff0c;赢取比赛门票和签名商品。 我们很高兴地宣布&#xff0c;我们将与意大利著名职业足球俱乐部那不勒斯足球俱乐部展开合作&#xff0c;在 4 个 UGC 体验中开设 “快闪商店”。在这个以传奇球队为灵感来源的独特数字…

[Meachines] [Medium] poison LFI+日志投毒+VNC权限提升

信息收集 IP AddressOpening Ports10.10.10.84TCP:22,80 $ nmap -p- 10.10.10.84 --min-rate 1000 -sC -sV 22/tcp open ssh OpenSSH 7.2 (FreeBSD 20161230; protocol 2.0) | ssh-hostkey: | 2048 e3:3b:7d:3c:8f:4b:8c:f9:cd:7f:d2:3a:ce:2d:ff:bb (RSA) | 256 …

Linux - 基础工具使用

文章目录 一、yum1、介绍2、功能3、语法4、使用 二、rzsz1、安装rzsz的指令2、介绍3、使用 三、vim基础使用1、介绍2、基础使用 四、gcc/g使用1、生成可执行文件过程2、语法3、常用选项4、编译过程5、动静态库6、链接外部库 一、yum 1、介绍 Linux中的yum是一个强大的软件包管…

部署 K8s 图形化管理工具 Dashboard

文章目录 一、Dashboard 概述二、GitHub 地址三、Dashboard 部署安装1、选择兼容版本2、下载配置文件3、添加 Dashboard 的Service类型4、应用部署5、查看 kubernetes-dashboard 命名空间下资源状态6、创建访问账户7、授权8、获取账号token9、1.24 版本以后的需要创建一个Pod 四…

STM32入门开发操作记录(九)——外部时钟定时器

目录 一、项目准备1. 工程模板2. 器件接线 二、外部时钟1. 端口复用2. 流程示意 三、定时器模块Timer.cTimer.h 四、遮光计数 一、项目准备 1. 工程模板 本篇项目所用模板包含以下模块&#xff0c;声明函数见头文件&#xff0c;模块添加和函数功能详见往期记录。   2. 器件…

alibabacloud学习笔记13

微服务Docker镜像打包讲解 父项目怎么springboot版本依赖 每个子模块项目添加依赖 添加构建文件&#xff1a; 微服务Docker镜像打包整合JDK11 服务根目录创建dockerFile文件. dockerFile的内容。 构建镜像( 去到子模块pom文件下)&#xff1a; 要下载这个才能使用本地docker.…

linux常用网络工具汇总三

linux常用网络工具汇总 6. 抓包工具6.1 wireshark安装界面介绍使用过滤器TCP协议示例关于wireshark的缺点 6.2 tcpdump命令格式关键字使用关于tcpdump的缺点 6.3 fiddler6.4 burpsuite 6. 抓包工具 6.1 wireshark Wireshark&#xff08;前称Ethereal&#xff09;是一个网络封…

谷歌账号异常后,恢复账号的时候验证手机号出现这样的界面就悬了

朋友们在使用谷歌账号玩游戏&#xff0c;或者浏览一些内容的时候&#xff0c;甚至啥也不干&#xff0c;过一阵仅仅来登录谷歌的时候可能会发现账号无法顺利登录。 往往是输入了谷歌账号&#xff08;邮箱地址&#xff09;后&#xff0c;经历过了纠结的人机验证后&#xff0c;输…

leetcode热题系列14

540. 有序数组中的单一元素 给定一个只包含整数的有序数组&#xff0c;每个元素都会出现两次&#xff0c;唯有一个数只会出现一次&#xff0c;找出这个数。 示例 1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2 示例 2: 输入: [3,3,7,7,10,11,11] 输出: 10 思路&#xff1a; 利用逻…

适合毕业生!分享好用的9款AI论文写作软件

对于即将毕业的大学生来说&#xff0c;撰写论文是一项既重要又具挑战性的任务。为了帮助大家更高效地完成这一过程&#xff0c;我将推荐几款适合毕业生使用的AI论文写作软件&#xff0c;并详细介绍它们的功能和优势。 1. 千笔-AIPassPaper 千笔-AIPassPaper是一款功能全面且用…

【Python学习-UI界面】PyQt5 小部件4-QRadioButton

样式如下&#xff1a; QRadioButton 类对象是一个带有文本标签的可选择按钮。用户可以在表单上选择其中一个选项。该类派生自QAbstractButton类。 单选按钮默认是自动排斥的。因此&#xff0c;在父窗口中只能选择一个单选按钮。 如果选择了其中一个按钮&#xff0c;则之前选择…