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

news2024/10/5 17:21:43

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加群”

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

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

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

相关文章

[leetcode] 33. 搜索旋转排序数组

文章目录 题目描述解题方法二分查找java代码复杂度分析 题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组…

防火墙安全策略及nat实验

要求一&#xff1a;生产区的设备在工作时间访问dmz区,仅可访问http服务器 要求二&#xff1a;办公区可以全天访问dmz区&#xff0c;其中10.0.2.20可以访问FTP服务器和HTTP服务器&#xff0c;10.0.2.10仅可以ping通10.0.3.10 要求三&#xff1a;办公区在访问服务器区时采用匿名认…

基于数据挖掘的微博事件分析与可视化大屏分析系统

设计原理&#xff0c;是指一个系统的设计由来&#xff0c;其将需求合理拆解成功能&#xff0c;抽象的描述系统的模块&#xff0c;以模块下的功能。功能模块化后&#xff0c;变成可组合、可拆解的单元&#xff0c;在设计时&#xff0c;会将所有信息分解存储在各个表中&#xff0…

使用C#快速创建一个非常实用的桌面应用程序

过节时和我年纪轻轻就一把年纪的弟弟张老二闲聊了许久&#xff0c;发现他对编程产生了一泡浓厚的兴趣&#xff0c;于是我就给他漏了一手C#&#xff0c;做了一个简单的适用于win-x64配置cpu的桌面应用程序。 步骤如下&#xff1a; 1.打开Visual Studio,点击新建项目&#xff0…

iOS AlDente 1.0自动防过充, 拯救电池健康度

经常玩iOS的朋友可能遇到过长时间过充导致的电池鼓包及健康度下降问题。MacOS上同样会出现该问题&#xff0c;笔者用了4年的MBP上周刚拿去修了&#xff0c;就是因为长期不拔电源的充电&#xff0c;开始还是电量一半的时候不接电源会黑屏无法开机&#xff0c;最后连着电源都无法…

【华为 ICT HCIA eNSP 习题汇总】——题目集12

1、企业网络内部常常采用私有 IP 地址进行通信&#xff0c;以下哪个地址属于私有 IP 地址&#xff1f; A、0.1.1.1 B、127.5.4.3 C、128.0.0.5 D、172.24.35.36 考点&#xff1a;网络层 解析&#xff1a;&#xff08;D&#xff09; A类 IP 地址中&#xff0c;10.0.0.0 ~ 10.255…

分享66个时间日期JS特效,总有一款适合您

分享66个时间日期JS特效&#xff0c;总有一款适合您 66个时间日期JS特效下载链接&#xff1a;https://pan.baidu.com/s/1niQUpDSs10gfGYKYnEgKRg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

【C语言初阶-结构体】关于结构体的声明定义、结构体传参详解

目录 1. 结构体的声明 1.1 结构的基础知识 1.2 结构的声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 2. 结构体成员的访问 2.1(.)操作符 2.2&#xff08;->&#xff09;操作符 3.结构体传参 1. 结构体的声明 1.1 结构的基础知识 结构体是一些值的集合&…

前端JavaScript篇之异步编程的实现方式?

目录 异步编程的实现方式&#xff1f;1. 回调函数2. Promise3. Async/Await4. Generator 异步编程的实现方式&#xff1f; 异步编程是处理需要等待的操作的一种方式&#xff0c;比如读取文件、发送网络请求或处理大量数据。在JavaScript中&#xff0c;有几种常见的实现方式&am…

工业制造:分布式控制系统(DCS),一文掌握。

一、什么是DCS 在工业制造领域&#xff0c;DCS 是分布式控制系统&#xff08;Distributed Control System&#xff09;的缩写。DCS 是一种用于监控和控制工业生产过程的自动化系统&#xff0c;通常由一组分布在工厂各个位置的控制单元和计算机组成&#xff0c;用于实时监测和控…

面试经典150题——三数之和

​"The road to success and the road to failure are almost exactly the same." - Colin R. Davis 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力方法 因为三个数相加为0&#xff0c;那么说明其中两个加数的和与另一个加数为相反数则满足题意。所以可以得到…

QT入门-基本控件

1.QTextEdit qt助手查看可知一些信息,其余信息见全文 1.1 functions public function如下: 使用时通过QT助手查找 实例: #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new …

第73左侧菜单实现

layout下面新建menu layout index.vue导入menu import Menu from /views/layout/menu菜单实现&#xff1a; <template><el-menuactive-text-color"#ffd04b"background-color"#2d3a4b"class"el-menu-vertical-demo"default-active&quo…

apk反编译修改教程系列---简单修改apk默认横竖屏显示 手机端与电脑端同步演示【十一】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

C语言 服务器编程-日志系统

日志系统的实现 引言最简单的日志类 demo按天日志分类和超行日志分类日志信息分级同步和异步两种写入方式 引言 日志系统是通过文件来记录项目的 调试信息&#xff0c;运行状态&#xff0c;访问记录&#xff0c;产生的警告和错误的一个系统&#xff0c;是项目中非常重要的一部…

02.数据结构

一、链表 作用&#xff1a;用于写邻接表&#xff1b; 邻接表作用&#xff1a;用于存储图或树&#xff1b; 1、用数组模拟单链表 #include<iostream> using namespace std;const int N 100010;// head 表示头结点的下标 // e[i] 表示结点i的值 // ne[i] 表示结点i的ne…

python适配器模式开发实践

1. 什么是适配器设计模式&#xff1f; 适配器&#xff08;Adapter&#xff09;设计模式是一种结构型设计模式&#xff0c;它允许接口不兼容的类之间进行合作。适配器模式充当两个不兼容接口之间的桥梁&#xff0c;使得它们可以一起工作&#xff0c;而无需修改它们的源代码。 …

数字孪生:构建未来智慧社区的关键技术

随着科技的快速发展&#xff0c;数字孪生技术作为构建未来智慧社区的关键技术&#xff0c;正逐渐受到广泛关注。数字孪生技术能够实现物理世界与数字世界的交互映射&#xff0c;为智慧社区的建设提供强有力的支持。本文将探讨数字孪生技术在构建未来智慧社区中的作用和意义&…

蓝牙BLE学习

1. 简介 1.1 蓝牙发展历程 蓝牙&#xff0c;直接来自于一位国王的名字--King Harald ‘Bluetooth Gromsson。这位国王因两件事留名于史&#xff0c;其一是在公园958年统一了丹麦和挪威&#xff0c;其二是在其死后&#xff0c;其牙齿呈现出暗蓝色的颜色&#xff0c;因而得名蓝牙…

【Tauri】(1):使用Tauri1.5版本,进行桌面应用开发,在windows,linux进行桌面GUI应用程序开发,可以打包成功,使用 vite 最方便

1&#xff0c;视频地址&#xff1a; https://www.bilibili.com/video/BV1Pz421d7s4/ 【Tauri】&#xff08;1&#xff09;&#xff1a;使用Tauri1.5版本&#xff0c;进行桌面应用开发&#xff0c;在windows&#xff0c;linux进行桌面GUI应用程序开发&#xff0c;可以打包成功&…