寻找最优的路测线 - 华为OD统一考试

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

评估一个网络的信号质量,其中一个做法是将网络划分为栅格,然后对每个栅格的信号质量计算。

路测的时候,希望选择一条信号最好的路线(彼此相连的栅格集合)进行演示。现给出 RC 列的整数数组 Cov ,每个单元格的数值 S 即为该栅格的信号质量(已归一化,无单位,值越大信号越好)。

要求从 [0,0] 到 [R−1,C−1] 设计一条最优路测路线。返回该路线得分。

规则:

  1. 路测路线可以 上下左右四个方向,不能对角。
  2. 路线的评分是以路线上信号最差的栅格为准的。例如路径 8→4→5→9 的值为 4 ,该线路评分为 4 。线路最优表示该条线路的评分最高。

输入描述

第一行表示栅格的行数 R;

第二行表示栅格的列数 C;

第三行开始,每一行表示栅格地图一行的信号值,每个单元格的数值为 S 。

  • 1≤R,C≤20
  • 1≤S≤65535

输出描述

最优路线的得分。

示例1

输入:
3
3
5 4 5
1 2 6
7 4 6

输出:
4

说明:
路线为: 5→4→5→6→6 。

示例2

输入:
6
5
3 4 6 3 4
0 2 1 1 7
8 8 3 2 7
3 2 4 9 8
4 1 2 0 0
4 6 5 4 3

输出:
3

说明:
路线为: 3→4→6→3→4→7→7→8→9→4→3→8→8→3→4→4→6→5→4→3 。

题解

该题目属于搜索算法的一种,通过搜索找到最优路径。首先,对于每个栅格,其数值 S 表示信号质量。我们需要从栅格 [0,0] 出发,沿着上下左右四个方向,选择信号最优的路径到达 [R-1,C-1]

为了找到最优路径,可以采用二分搜索的方式,不断调整路径信号的评分限制,直到找到最优路径。在搜索路径的过程中,需要使用队列或栈等数据结构来保存当前搜索的状态。

Java

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int R = scanner.nextInt(), C = scanner.nextInt();
        int[][] cov = new int[R][C];

        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                cov[i][j] = scanner.nextInt();
            }
        }

        int l = 1, r = 65535 + 1;
        while (l + 1 < r) {
            int m = (l + r) >> 1;
            if (ok(R, C, cov, m)) {
                l = m;
            } else {
                r = m;
            }
        }
        System.out.println(l);
    }

    // 条线路的评分 limit 能否从 (0,0) 到达 (R-1, C-1)
    private static boolean ok(int R, int C, int[][] cov, int limit) {
        boolean[][] vis = new boolean[R][C];
        int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

        // 初始化队列,起点为 (0, 0)
        Queue<int[]> queue = new ArrayDeque<>();
        queue.offer(new int[]{0, 0});

        while (!queue.isEmpty()) {
            int[] current = queue.poll();
            int r = current[0], c = current[1];

            if (cov[r][c] < limit) continue;   // 信号质量不够,跳过
            vis[r][c] = true;

            // 遍历四个方向
            for (int[] direction : directions) {
                int nr = r + direction[0], nc = c + direction[1];
                if (0 <= nr && nr < R && 0 <= nc && nc < C && !vis[nr][nc]) {
                    queue.offer(new int[]{nr, nc});
                }
            }
        }

        return vis[R - 1][C - 1];
    }
}

Python

R, C = int(input()), int(input())
cov = [list(map(int, input().split())) for _ in range(R)]


def ok(limit: int) -> bool:
    """ 条线路的评分 limit 能否从 (0,0) 到达 (R-1, C-1) """
    global R, C, cov
    vis = [[False] * C for _ in range(R)]
    q = [(0, 0)]

    while q:
        r, c = q.pop()
        if cov[r][c] < limit:  # 信号质量不够,跳过
            continue
        vis[r][c] = True
        for dr, dc in [(0, 1), (1, 0), (0, -1), (-1, 0)]:  # 上下左右四个位置
            nr, nc = r + dr, c + dc
            if 0 <= nr < R and 0 <= nc < C and not vis[nr][nc]:
                q.append((nr, nc))

    return vis[R-1][C-1]


l, r = 1, 65535 + 1
while l + 1 < r:
    m = (l + r) >> 1
    if ok(m):
        l = m
    else:
        r = m
print(l)

C++

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

int main() {
    int R, C;
    cin >> R >> C;

    // 读取输入矩阵
    vector<vector<int>> cov(R, vector<int>(C));
    for (int i = 0; i < R; ++i) {
        for (int j = 0; j < C; ++j) {
            cin >> cov[i][j];
        }
    }

    // 定义函数 ok
    auto ok = [&](int limit) -> bool {
        vector<vector<bool>> vis(R, vector<bool>(C, false));
        stack<pair<int, int>> q;
        q.push({0, 0});

        while (!q.empty()) {
            int r = q.top().first;
            int c = q.top().second;
            q.pop();

            if (cov[r][c] < limit) {
                continue;  // 信号质量不够,跳过
            }

            vis[r][c] = true;

            // 遍历四个方向
            vector<pair<int, int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
            for (const auto& direction : directions) {
                int nr = r + direction.first;
                int nc = c + direction.second;

                if (0 <= nr && nr < R && 0 <= nc && nc < C && !vis[nr][nc]) {
                    q.push({nr, nc});
                }
            }
        }

        return vis[R-1][C-1];
    };

    // 二分搜索
    int l = 1, r = 65535 + 1;
    while (l + 1 < r) {
        int m = (l + r) >> 1;
        if (ok(m)) {
            l = m;
        } else {
            r = m;
        }
    }

    cout << l << endl;

    return 0;
}

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《数电》理论笔记-第1章-逻辑代数基础

参考&#xff1a;视频 和 《数字电路与逻辑设计》 电子书 一&#xff0c;第1章 逻辑代数基础 1 数字量和模拟量 略 2 数制&#xff08;十进制&#xff0c;二进制&#xff0c;八进制和十六进制&#xff09; 拨电话&#xff08;BoDH&#xff09;---&#xff08;2八10十六&…

【Django】Django项目部署

项目部署 1 基本概念 项目部署是指在软件开发完毕后&#xff0c;将开发机器上运行的软件实际安装到服务器上进行长期运行。 在安装机器上安装和配置同版本的环境[python&#xff0c;数据库等] django项目迁移 scp /home/euansu/Code/Python/website euansuxx.xx.xx.xx:/home…

labelImg和labelme区别

LabelImg和LabelMe是两种常用的标注工具&#xff0c;用于创建标注数据集以供机器学习和计算机视觉任务使用。虽然它们都具有相似的目标&#xff0c;即方便用户进行图像标注&#xff0c;但在某些方面存在一些区别。下面将介绍LabelImg和LabelMe的区别及联系&#xff0c;同时提供…

如何写出别人写不出的内容(译)

&#xff08;译者序&#xff1a;这篇文章不只是写作&#xff0c;对信息获取、阅读也都有启发。随着社交媒体和 AI 的发展&#xff0c;人们越来越被动的接收海量信息&#xff0c;如何主动查找与整理对自己有用的内容&#xff0c;将是一个不可或缺的能力。&#xff09; 原文&…

模型 PMF(产品市场契合度)

系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。产品与市场高度契合。 1 PMF(Product Market Fit)产品市场契合度 的应用 1.1 PMF在创业过程中的应用-Vincy公司的产品PartnerShare 实现PMF需要企业深入了解目标市场的需求和用户的反馈&…

导数的定义【高数笔记】

【含义】可以抽象成&#xff0c;在一个极其短的时间段内&#xff0c;温度差 / 时间差 【本质】瞬间的平均值 【分类】可以分成几类&#xff1f;每类需要注意的点 【导数存在的必要条件】 【导数与极限的关系】可以参考导数的定义的式子 【题型解法】分几个题型&#xff1f;每个…

C++ shell - 在线 C++ 编译器

C shell - 在线 C 编译器 1. C shell2. Example program3. Options4. ExecutionReferences 1. C shell C Shell v2 https://cpp.sh/ https://cpp.sh/about.html C Shell v2, free online compiler, proudly uses emscripten to compile your code. emscripten is a clang-ba…

联想DP510、DP520、DP515打印机恢复出厂和自定义纸张方法

联想DP510、DP520、DP515恢复出厂设置方法 一、按下打印方式键&#xff0c;同时开机&#xff0c;直至打印头动作停止时松手&#xff1b; 二、水平装入 A4 纸&#xff0c;打印机自动调入并开始打印&#xff0c;若打印机将纸退出&#xff0c;将纸放平重新装入&#xff1b; 三、…

寒假9-蓝桥杯训练

//轨道炮 #include<iostream> using namespace std; #include<algorithm> int logs[100010]; int main() {int n;cin >> n;for (int i 1;i < n;i){cin >> logs[i];}sort(logs 1, logs n 1);int ans 1000000000;for (int i 2;i < n;i){if (…

Java:字符集、IO流 --黑马笔记

一、字符集 1.1 字符集的来历 我们知道计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一个字符进行了编码&#xff08;所谓编码&#xff0c;就是为一个…

【AutoML】AutoKeras 进行 RNN 循环神经网络训练

由于最近这些天都在人工审查之前的哪些问答数据&#xff0c;所以迟迟都没有更新 AutoKeras 的训练结果。现在那部分数据都已经整理好了&#xff0c;20w 的数据最后能够使用的高质量数据只剩下 2k。这 2k 的数据已经经过数据校验并且对部分问题的提问方式和答案内容进行了不改变…

为什么Python是数据科学家的首选语言

这篇文章全面探讨了Python作为数据科学领域首选语言的原因。从Python的历史、特性&#xff0c;到在数据科学中的应用实例&#xff0c;再到与其他数据科学语言的比较&#xff0c;以及在实际企业中的应用&#xff0c;我们深入剖析了Python的优势与挑战&#xff0c;最后对Python的…

Linux:信号的保存

文章目录 信号相关概念信号递达信号未决信号阻塞内核中的示意图 信号集的操作函数 前面对于信号的产生中对操作系统有了一个基础的认知&#xff0c;对于一个真正的操作系统来说&#xff0c;进程是由操作系统进行调度的&#xff0c;那操作系统本身也是代码&#xff0c;是由谁进行…

算法沉淀——模拟(leetcode真题剖析)

算法沉淀——模拟 01.替换所有的问号02.提莫攻击03.Z字形变换04.外观数列05.数青蛙 模拟算法是一种通过模拟问题的描述或场景来解决问题的算法。这种算法的核心思想是按照问题描述的规则&#xff0c;逐步模拟问题的发展过程&#xff0c;从而得到问题的解决方案。通常&#xff0…

python-自动化篇-终极工具-用GUI自动控制键盘和鼠标-pyautogui

文章目录 用GUI自动控制键盘和鼠标pyautogui 模块鼠标屏幕位置——移动地图——pyautogui.size鼠标位置——自身定位——pyautogui.position()移动鼠标——pyautogui.moveTo拖动鼠标滚动鼠标 键盘按下键盘释放键盘 开始与结束通过注销关闭所有程序 用GUI自动控制键盘和鼠标 在…

InternLM大模型实战-4.XTuner大模型低成本微调实战

文章目录 前言笔记正文XTuner支持模型和数据集 微调原理跟随文档学习快速上手自定义微调准备数据准备配置文件 MS-Agent微调 前言 本文是对于InternLM全链路开源体系系列课程的学习笔记。【XTuner 大模型单卡低成本微调实战】 https://www.bilibili.com/video/BV1yK4y1B75J/?…

python coding with ChatGPT 打卡第20天| 二叉搜索树:搜索、验证、最小绝对差、众数

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…

巧用Java 8中的 Function接口,消灭if.else!

点击上方“程序员蜗牛g”&#xff0c;选择“设为星标” 在开发过程中经常会使用if...else...进行判断抛出异常、分支处理等操作。这些if...else...充斥在代码中严重影响了代码代码的美观&#xff0c;这时我们可以利用Java 8的Function接口来消灭if...else...。 if (...){thro…

联想thinkpad-E450双系统升级记

早期笔记本联想thinkpad-E450双系统 大约16年花4000多大洋&#xff0c;买了一台thinkpad-E450屏幕是16寸本&#xff0c;有AMD独立显卡&#xff0c;i5cpu&#xff0c;4G内存。 . 后来加了一个同型号4G内存组成双通道&#xff0c; . 加了一个三星固态500G&#xff0c; . 换了一个…

【更新】企业数字化转型-年度报告175个词频、文本统计

数据说明&#xff1a; 这份数据含数字化转型175个词频、各维度水平&#xff0c;保留2000-2021年数据。参考吴非、赵宸宇两位老师做法&#xff0c;根据上市公司年报文本&#xff0c;整理数字化转型175个词频数据&#xff0c;希望对大家有所帮助。 参考管理世界中吴非&#xff…