E卷-智能驾驶-(200p)

智能驾驶

题目描述

LYA开发了一款智能驾驶系统,可以让汽车在 的地图上从左上角(起点)开往右下角(终点)。地图上的每个位置都有一个数字,表示汽车经过该位置需要消耗的油量。地图上还有一些加油站,汽车经过加油站时可以加满油。

LYA想知道,汽车从起点出发,确保能够到达终点,初始时油箱里至少需要多少油量。

注意:

  1. 汽车可以向上、下、左、右四个方向行驶。
  2. 地图上的数字含义如下:
    • :表示该位置是加油站,汽车经过时可以将油箱加满,油箱容量为
    • :表示该位置是障碍物,汽车无法通过。
    • 正整数:表示汽车经过该位置需要消耗的油量。
  3. 如果无论初始油量多少,汽车都无法到达终点,则输出

输入格式

第一行包含两个正整数 ,表示地图的行数和列数,满足

接下来 行,每行包含 个整数,表示地图上每个位置的数字。输入保证加油站的总数不超过 个。

输出格式

输出一个整数,表示汽车从起点出发,确保能够到达终点,初始时油箱里至少需要的油量。

如果无论初始油量多少,汽车都无法到达终点,则输出

样例输入

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

样例解释

无论初始油量多少,汽车都无法到达终点。

数据范围

加油站的总数不超过

题解

本题可以使用二分查找和BFS来解决。

首先,我们可以确定初始油量的范围,最小值为 ,最大值为地图上非障碍物位置的油量消耗之和。

然后,我们在这个范围内进行二分查找,每次选择一个中间值作为初始油量,判断以这个初始油量是否能够从起点到达终点。

判断的过程可以使用BFS。从起点开始,将当前位置和剩余油量加入队列。每次从队列中取出一个位置,如果该位置是终点,则说明以当前的初始油量可以到达终点;如果该位置是加油站,则将剩余油量置为油箱容量;否则,将剩余油量减去该位置的油量消耗。然后,将该位置的四个相邻位置加入队列(如果剩余油量足够且未访问过)。如果队列为空,说明无法到达终点。

通过二分查找,我们可以找到最小的初始油量,使得汽车能够从起点到达终点。

参考代码

  • Python
import heapq

def check(mid):
    dis = [[-1] * m for _ in range(n)]
    vis = [[False] * m for _ in range(n)]
    dis[0][0] = mid - grid[0][0]
    if grid[0][0] == -1:
        dis[0][0] = 100
    elif grid[0][0] == 0 or dis[0][0] < 0:
        return False
    q = [(-dis[0][0], 0, 0)]
    dx = [0, 1, 0, -1]
    dy = [1, 0, -1, 0]
    while q:
        w, x, y = heapq.heappop(q)
        w = -w
        if vis[x][y]:
            continue
        vis[x][y] = True
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < n and 0 <= ny < m and grid[nx][ny] != 0 and not vis[nx][ny] and grid[nx][ny] <= w:
                if grid[nx][ny] == -1:
                    nw = 100
                else:
                    nw = w - grid[nx][ny]
                if nw > dis[nx][ny]:
                    dis[nx][ny] = nw
                    heapq.heappush(q, (-nw, nx, ny))
    return vis[n - 1][m - 1]

n, m = map(int, input().split(','))
grid = [list(map(int, input().split(','))) for _ in range(n)]

left, right = 0, 100
ans = -1
while left <= right:
    mid = (left + right) // 2
    if check(mid):
        ans = mid
        right = mid - 1
    else:
        left = mid + 1
print(ans)
  • Java
import java.util.*;

public class Main {
    static int n, m;
    static int[][] grid;
    static int[] dx = {0, 1, 0, -1};
    static int[] dy = {1, 0, -1, 0};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] nm = sc.nextLine().split(",");
        n = Integer.parseInt(nm[0]);
        m = Integer.parseInt(nm[1]);
        grid = n

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

已注销:再接着投吧项目经历太流水账,且没有实习经历,我之前也是这样,后来跟着大厂导师修改了项目和简历之后成功上岸,有需要可以问我
点赞 评论 收藏
分享
嗨害嗨我来了:你跟他说开迈巴赫呢,一个月好几万,让学弟尝尝一点小小的社会险恶
点赞 评论 收藏
分享
牛马为难牛马中,疑似阿里的员工看某个从拼多多跳槽过来的员工抢他的A+绩效不顺眼,反手向多多举报的,结果导致人家竞业被发现了,违约金5w,赔偿100+w上海长宁区劳动人事争议仲裁委公告显示:上海寻梦信息技术有限公司(拼多多主体)与一名员工的劳动争议案,因被申请人未到庭,仲裁委依法缺席裁决。结果是,该员工需要返还已发放的竞业补偿58,211.29元,并按约支付违约金1,089,103元。公告自发布30日后视为送达,15日内不诉即生效
nova!1028:竞业避坑指南:1、平时戴口罩及帽子、墨镜,不在公共场所露面 2、不在现有公司收快递 3、自己竞业期间社保缴纳不挂靠,最好不交 4、三方公司不能对外说可挂医社保 5、记住社保缴纳地的地址 6、注意陌生可疑电话,比如猎头 7、自己名下车子不要出入到服务的场所 8、竞业到期后不能马上出现在竞对公司股东信息上 9、注意平台简历内容,会被取证 10、竞业期过后,不要透露过往,以防被追溯 11、非必要不开大会和培训,注意公司内鬼 12、不在社交平台展示自己 13、电话卡不用自己名字登记 14、注意陌生的外卖 15、注意动车票信息 16、竞业期低调不结仇 复制过来的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务