华为OD机试 - 信号强度(Python/JS/C/C++ 2024 E卷 100分)

news2024/9/21 20:22:21

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。

注意:

  1. 网络信号可以绕过阻隔物array[m][n]的二维数组代表网格地图,array[i][j]=0代表i行j列是空旷位置;
  2. array[i][j]=x(x为正整数)代表i行j列是信号源,信号强度是x;
  3. array[i][j]=-1代表i行j列是阻隔物。

信号源只有1个,阻隔物可能有0个或多个网络信号衰减是上下左右相邻的网格衰减1现要求输出对应位置的网络信号值。

二、输入描述

输入为三行,

  1. 第一行为m n,代表输入是一个m*n的数组;
  2. 第二行是一串m*n个用空格分隔的整数。每连续n个数代表一行,再往后n个代表下一行,以此类推。对应的值代表对应的网格是空旷位置,还是信号源,还是阻隔物;
  3. 第三行是i j,代表需要计算array[i][j]的网络信号值,注意:此处i和j均从0开始,即第一行i为0;

例如:

6 5
0 0 0 -1 0 0 0 0 0 0 0 0 -1 4 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0
1 4

代表如下地图

需要输出第2行第1列的网络信号值。

三、输出描述

输出对应位置的网络信号值,如果网络信号未覆盖到,也输出0。

一个网格如果可以途经不同的传播衰减路径传达,取较大的值作为其信号值。

四、补充说明

  1. m不一定等于n,m<100,n<100,网络信号值小于1000;
  2. 信号源只有1个,阻隔物可能有0个或多个;
  3. 输入的m,n与第二行的数组是合法的,无需处理数量对不上的异常情况;
  4. 要求输出信号值的位置,不会是阻隔物

五、解题思路

  1. 读取输入的m和n,表示数组的行数和列数。
  2. 创建一个大小为m*n的二维数组arr来存储输入的网格地图。
  3. 使用变量x和y记录信号源的坐标,初始化为0。
  4. 使用两重循环遍历输入的m*n个整数,同时找到信号源的坐标。
  5. 读取结果坐标x1和y1。
  6. 调用递归函数get(x, y, arr)来计算网络信号值。
  7. 输出arr[x1][y1]作为结果。

递归函数get(x, y, arr)的思路如下:

  1. 获取arr的行数m和列数n。
  2. 如果x或y超出数组的边界,直接返回。
  3. 如果arr[x][y]小于等于1,说明该位置已经被覆盖,直接返回。
  4. 创建一个数组arr2,其中每个元素表示相邻位置的偏移量,分别为左、右、上、下。
  5. 遍历arr2中的每个偏移量:
    • 计算相邻位置的坐标a和b。
    • 如果a或b超出数组的边界,跳过当前循环。
    • 如果arr[a][b]为-1,说明该位置是阻隔物,跳过当前循环。
    • 如果arr[x][y]-1大于arr[a][b],说明通过当前位置可以提供更强的信号,更新arr[a][b]的值为arr[x][y]-1。
    • 调用递归函数get(a, b, arr)继续向相邻位置传播信号。
  6. 递归函数结束。

六、Python算法源码

def get(x, y, arr):
    m = len(arr)
    n = len(arr[0])
    
    # 边界检查
    if x < 0 or x >= m or y < 0 or y >= n:
        return
    if arr[x][y] <= 1:
        return
    
    # 方向数组,用于上下左右移动
    directions = [[0, -1], [0, 1], [-1, 0], [1, 0]]
    
    for direction in directions:
        a = x + direction[0]
        b = y + direction[1]
        # 检查是否在数组边界内
        if 0 <= a < m and 0 <= b < n:
            # 跳过值为-1的位置
            if arr[a][b] == -1:
                continue
            # 如果当前位置信号更强,更新并递归
            if arr[x][y] - 1 > arr[a][b]:
                arr[a][b] = arr[x][y] - 1
                # 递归
                get(a, b, arr)

def main():
    m = int(input("请输入行数: "))
    n = int(input("请输入列数: "))
    arr = []
    
    # 初始化数组并获取信号源位置
    x, y = 0, 0
    for i in range(m):
        row = list(map(int, input().split()))
        arr.append(row)
        for j in range(n):
            if arr[i][j] > 0:
                x, y = i, j
    
    # 获取结果坐标
    x1 = int(input("请输入结果的横坐标: "))
    y1 = int(input("请输入结果的纵坐标: "))
    
    # 处理信号扩散
    get(x, y, arr)
    
    # 输出结果
    print(arr[x1][y1])

if __name__ == "__main__":
    main()

七、JavaScript算法源码

function get(x, y, arr) {
    const m = arr.length;
    const n = arr[0].length;

    // 边界检查
    if (x < 0 || x >= m || y < 0 || y >= n) {
        return;
    }
    if (arr[x][y] <= 1) {
        return;
    }

    // 方向数组,用于上下左右移动
    const directions = [
        [0, -1], [0, 1], [-1, 0], [1, 0]
    ];

    for (const direction of directions) {
        const a = x + direction[0];
        const b = y + direction[1];

        // 检查是否在数组边界内
        if (a >= 0 && a < m && b >= 0 && b < n) {
            // 跳过值为-1的位置
            if (arr[a][b] === -1) {
                continue;
            }
            // 如果当前位置信号更强,更新并递归
            if (arr[x][y] - 1 > arr[a][b]) {
                arr[a][b] = arr[x][y] - 1;
                // 递归
                get(a, b, arr);
            }
        }
    }
}

function main() {
    const m = parseInt(prompt("请输入行数: "), 10);
    const n = parseInt(prompt("请输入列数: "), 10);
    const arr = [];

    // 初始化数组并获取信号源位置
    let x = 0, y = 0;
    for (let i = 0; i < m; i++) {
        const row = prompt(`请输入第${i + 1}行的元素(以空格分隔): `).split(' ').map(Number);
        arr.push(row);
        for (let j = 0; j < n; j++) {
            if (arr[i][j] > 0) {
                x = i;
                y = j;
            }
        }
    }

    // 获取结果坐标
    const x1 = parseInt(prompt("请输入结果的横坐标: "), 10);
    const y1 = parseInt(prompt("请输入结果的纵坐标: "), 10);

    // 处理信号扩散
    get(x, y, arr);

    // 输出结果
    console.log(arr[x1][y1]);
}

main();

八、C算法源码

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

// 递归函数用于扩散信号
void get(int x, int y, int **arr, int m, int n) {
    // 边界检查
    if (x < 0 || x >= m || y < 0 || y >= n) {
        return;
    }
    if (arr[x][y] <= 1) {
        return;
    }

    // 方向数组,用于上下左右移动
    int directions[4][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};

    for (int i = 0; i < 4; i++) {
        int a = x + directions[i][0];
        int b = y + directions[i][1];

        // 检查是否在数组边界内
        if (a >= 0 && a < m && b >= 0 && b < n) {
            // 跳过值为-1的位置
            if (arr[a][b] == -1) {
                continue;
            }
            // 如果当前位置信号更强,更新并递归
            if (arr[x][y] - 1 > arr[a][b]) {
                arr[a][b] = arr[x][y] - 1;
                // 递归
                get(a, b, arr, m, n);
            }
        }
    }
}

int main() {
    int m, n;

    // 输入行数和列数
    printf("请输入行数: ");
    scanf("%d", &m);
    printf("请输入列数: ");
    scanf("%d", &n);

    // 动态分配二维数组
    int **arr = (int **)malloc(m * sizeof(int *));
    for (int i = 0; i < m; i++) {
        arr[i] = (int *)malloc(n * sizeof(int));
    }

    // 初始化数组并获取信号源位置
    int x = 0, y = 0;
    printf("请输入数组元素(每行 %d 个,以空格分隔):\n", n);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &arr[i][j]);
            if (arr[i][j] > 0) {
                x = i;
                y = j;
            }
        }
    }

    // 输入结果的坐标
    int x1, y1;
    printf("请输入结果的横坐标: ");
    scanf("%d", &x1);
    printf("请输入结果的纵坐标: ");
    scanf("%d", &y1);

    // 处理信号扩散
    get(x, y, arr, m, n);

    // 输出结果
    printf("结果:%d\n", arr[x1][y1]);

    // 释放内存
    for (int i = 0; i < m; i++) {
        free(arr[i]);
    }
    free(arr);

    return 0;
}

九、C++算法源码

#include <iostream>
#include <vector>

using namespace std;

// 递归函数用于扩散信号
void get(int x, int y, vector<vector<int>>& arr) {
    int m = arr.size();
    int n = arr[0].size();

    // 边界检查
    if (x < 0 || x >= m || y < 0 || y >= n) {
        return;
    }
    if (arr[x][y] <= 1) {
        return;
    }

    // 方向数组,用于上下左右移动
    int directions[4][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};

    for (int i = 0; i < 4; i++) {
        int a = x + directions[i][0];
        int b = y + directions[i][1];

        // 检查是否在数组边界内
        if (a >= 0 && a < m && b >= 0 && b < n) {
            // 跳过值为-1的位置
            if (arr[a][b] == -1) {
                continue;
            }
            // 如果当前位置信号更强,更新并递归
            if (arr[x][y] - 1 > arr[a][b]) {
                arr[a][b] = arr[x][y] - 1;
                // 递归
                get(a, b, arr);
            }
        }
    }
}

int main() {
    int m, n;

    // 输入行数和列数
    cout << "请输入行数: ";
    cin >> m;
    cout << "请输入列数: ";
    cin >> n;

    // 初始化二维数组
    vector<vector<int>> arr(m, vector<int>(n));

    // 初始化数组并获取信号源位置
    int x = 0, y = 0;
    cout << "请输入数组元素(每行 " << n << " 个,以空格分隔):\n";
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cin >> arr[i][j];
            if (arr[i][j] > 0) {
                x = i;
                y = j;
            }
        }
    }

    // 输入结果的坐标
    int x1, y1;
    cout << "请输入结果的横坐标: ";
    cin >> x1;
    cout << "请输入结果的纵坐标: ";
    cin >> y1;

    // 处理信号扩散
    get(x, y, arr);

    // 输出结果
    cout << "结果: " << arr[x1][y1] << endl;

    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

网站渗透这块水太深,你把握不住!但你叔我能(十年经验分享)

很多朋友问我&#xff0c;想搞网络安全&#xff0c;编程重要吗&#xff0c;选什么语言呢&#xff1f; 国内其实正经开设网络安全专业的学校很少&#xff0c;大部分同学是来自计算机科学、网络工程、软件工程专业的&#xff0c;甚至很多非计算机专业自学的。因此不像这三个专业…

【技术文章】ArcGIS Pro如何批量导出符号和工程样式?

目录 1.确定Pro软件版本 2.共享工程样式 3.管理和调用项目样式 制作好的地图&#xff0c;如何快速分享地图中的符号样式用于其它地图的制作&#xff1f; 在ArcMap软件中&#xff0c;可以通过命令一键批量导出所有符号。ArcGIS Pro软件是否也可以批量导出符号用于其它地图…

Java-数据结构-排序-(一) (。・ω・。)

文本目录&#xff1a; ❄️一、排序的概念及引用&#xff1a; ➷ 排序的概念&#xff1a; ➷ 常见的排序算法&#xff1a; ❄️二、插入排序的实现&#xff1a; ➷ 1、直接插入排序&#xff1a; ☞ 直接插入排序的基本思想&#xff1a; ☞ 直接插入排序的实现&#xff1a; ▶…

UI自动化测试(python)Web端4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

PyCharm与Anaconda超详细安装配置教程

1、安装Anaconda&#xff08;过程&#xff09;-CSDN博客 2.创建虚拟环境conda create -n pytorch20 python3.9并输入conda activate pytorch20进入 3.更改镜像源conda/pip(只添加三个pip源和conda源即可) 4.安装PyTorch&#xff08;CPU版&#xff09; 5.安装Pycharm并破解&…

使用 Anaconda 环境在Jupyter和PyCharm 中进行开发

目录 前言 一、在特定环境中使用jupyter 1. 列出所有环境 2. 激活环境 3. 进入 Jupyter Notebook 二、在特定环境中使用pycham 1. 打开 PyCharm 2. 打开设置 3. 配置项目解释器 4. 选择 Conda 环境 5. 应用设置 6. 安装所需库&#xff08;如果需要&#xff09; 总结 &#x1f3…

2024年中国研究生数学建模竞赛C题——解题思路

2024年中国研究生数学建模竞赛C题——解题思路 数据驱动下磁性元件的磁芯损耗建模——解决思路 二、问题描述 为解决磁性元件磁芯材料损耗精确计算问题&#xff0c;通过实测磁性元件在给定工况&#xff08;不同温度、频率、磁通密度&#xff09;下磁芯材料损耗的数据&#xf…

卡西欧相机SD卡格式化后数据恢复指南

在数字摄影时代&#xff0c;卡西欧相机以其卓越的性能和便携性成为了众多摄影爱好者的首选。然而&#xff0c;随着拍摄量的增加&#xff0c;SD卡中的数据管理变得尤为重要。不幸的是&#xff0c;有时我们可能会因为操作失误或系统故障而将SD卡格式化&#xff0c;导致珍贵的照片…

在线骑行网站设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装在线骑行网站软件来发挥其高效地信息处理的作用&#xff0c…

C++之深拷贝和浅拷贝*

两者本质&#xff1a; 浅拷贝&#xff1a;简单的赋值拷贝操作 深拷贝&#xff1a;在堆区中重新申请空间&#xff0c;进行拷贝操作new & delete 注意事项&#xff1a;堆区是在地址中重新申请空间&#xff0c;所以后续一系列操作new delete是通过指针* age进行操作&#xff0…

某 XXX 云主机,使用感受

简单来说就是: 垃圾&#xff01; 1. 登录垃圾。 我都已经实名认证了&#xff0c; 手机验证码非要发2遍。非要给我起个很难记住的账户名 2. 文档垃圾。 太高估用户的水平了。 建议做点视频教程。而不是各种文档&#xff0c;互相链接&#xff0c;转来转去&#xff0c; 让人心…

LeetCode[简单] 20.有效的括号

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

NRK3502空气净化器语音芯片方案,本地识别算法+芯片架构

随着环境污染问题的日益严重&#xff0c;空气净化器成为人们居家、办公环境中不可或缺的设备&#xff0c;为了提升用户体验和产品性能&#xff0c;广州九芯电子研发出了一款创新的空气净化器语音芯片方案--NRK3502。此方案结合了本地识别算法与芯片架构&#xff0c;提供Turnkey…

SpringBoot+vue集成sm2国密加密解密

文章目录 前言认识SM2后端工具类实现引入依赖代码实现工具类&#xff1a;SM2Util 单元测试案例1&#xff1a;生成服务端公钥、私钥&#xff0c;前端js公钥、私钥案例2&#xff1a;客户端加密&#xff0c;服务端完成解密案例3&#xff1a;服务端进行加密&#xff08;可用于后面前…

巴蒂克图案识别系统源码分享

巴蒂克图案识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

安全热点问题

安全热点问题 1.DDOS2.补丁管理3.堡垒机管理4.加密机管理 1.DDOS 分布式拒绝服务攻击&#xff0c;是指黑客通过控制由多个肉鸡或服务器组成的僵尸网络&#xff0c;向目标发送大量看似合法的请求&#xff0c;从而占用大量网络资源使网络瘫痪&#xff0c;阻止用户对网络资源的正…

手把手教你java+selenium数据驱动测试框架搭建与实践

最近在看JavaseleniumTestNgExcel的数据驱动&#xff0c;如何使用TestNg和Excel进行数据驱动测试。我其实是个自动化测试小白&#xff0c;工作之余看看这方面的书&#xff0c;照着敲敲代码&#xff0c;慢慢理解&#xff0c;希望通过自己坚持不懈的努力&#xff0c;在测试这个职…

Python语言基础教程(下)4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

记录一下(goland导入其他包方法编译不了爆红但能正常使用)

在goLand里面新建go文件,里面放了一个方法,首字符也大写了,但是在别的包里面报错显示无法识别,爆红显示,但是项目能正常运行,这里说下我的解决方案 即可解决

软件设计师——操作系统

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;软考——软件设计师&#x1f3c5;往期回顾&#x1f3c6;&#xff1a;C: 类和对象&#xff08;上&#xff09;&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱 一、操作系统…