【华为OD机试真题】信号发射和接收(javaC++python)100%通过率 超详细代码注释 代码深度解读

news2024/12/23 13:45:39

信号发射和接收

知识点数组栈 单调栈时间限制: 1s 空间限制: 256MB 限定语言:不限

题目描述:

有一个二维的天线矩阵,每根天线可以向其他天线发射信号也能接收其他天线的信号,为了简化起见,我们约定每根天线只能向东和向南发射信号,换言之,每根天线只能接收东向或南向发送的信号。
每根天线有自己的高度anth,各根天线的高度存储在一个二维数组中,各个天线的位置用[r, c]表示,r代表天线的行位置 (从0开始编号),c代表天线的列位置 (从0开始编号)
在某一方向 (东向或南向),某根天线可以收到多根其他天线的信号 (也可能收不到任何其他天线的信号),对任一天线X和天线Y,天线X能接收到天线Y的信号的条件是:
天线X在天线Y的东边或南边;
天线X和天线Y之间的其他天线的高度都低于天线X和天线Y,或天线X和天线Y之间无其他天线,即无遮挡,
如下图1示意:
在这里插入图片描述

在天线矩阵的第0行上,天线[0,0]接收不到任何其他天线的信号天线[0,1]可以接收到天线[0.0]的信号,天线[0,2]可以接收到天线[0,1]的信号天线[0,3]可以接收到天线[0,1]和天线[0,2]的信号,天线[0,4]可以接收到天线[0,3]的信号,天线[0,5]可以接收到天线[0,4]的信号;在天线矩阵的第0列上,天线[0,0]接收不到任何其他天线的信号,天线[1,0]可以接收到天线[0,0]的信号,天线[2,0]可以接收到天线[1,0]的信号,天线[3,0]可以接收到天线[1.0]和天线[2.0]的信号,天线[4,0]可以接收到天线[3,0]的信号,天线[5,0]可以接收到天线[3,0]和天线[4,0]的信号

给一个m行n列的矩阵(二维数组),知阵存储各根天线的高度,求出每根天线可以收到多少根其他天线的信号,结果输出到m行n列的矩阵(维数组) 中。

输入描述:

输入为1个m行n列的矩阵 (二维数组) anthh[m][n],矩阵存储各根天线的高度,高度值anthh[n[c]为大于0的整数。具体示例如下:

m n
anth[0][0] anth[0][1] ... anth[0][n-1] anth[1][0] anth[1][1] ... anth[1][n-1] ... anth[m-1][0]anth[m-1][n-1]

第1行为输入矩阵的行数和列数
第2行为输入矩阵的元素值,按行输入

输出描述:

输出1个m行n列的矩阵 (二维数组) ret[m][n],矩阵存储每根天线能收到多少根其他天线的信号,根数为ret][c]。具体示例如下:

m n
ret[0][0] ret[0][1] ... ret[0][n-1] ret[1][0] ret[1][1] ... ret[1][n-1] ... ret[m-1][0] ... ret[m-1][n-1]

第1行为输出矩阵的行数和列数
第2行为输出矩阵的元素值,按行输出

补充说明:

1 <= m <= 500
1<= n <= 500
0 < ant[r][c] <10^5

示例1

输入:

1 6
2 4 1 5 3 3

输出:

1 6
0 1 1 2 1 1

说明:

输入为1行6列的天线矩阵的高度值
[2 4 1 5 3 3]
输出为1行6列的结果矩降
[0 1 1 2 1 1]

示例2

输入:

2 6
2 5 4 3 2 8 9 7 5 10 10 3

输出:

2 6
0 1 1 1 1 4 1 2 2 4 2 2

说明:

输入为2行6列的天线知阵高度值

[2 5 4 3 2 8]
[9 7 5 10 10 3]

输出为2行6列的结果矩阵

[0 1 1 1 1 4]
[1 2 2 4 2 2]

结果说明:

天线[0,0]收不到任何其他天线的信号,因此ret[0,0]=0;
天线[0,1]可接收到天线[0,0]的信号,因此ret[0,1]=1;
天线[0,2]可以接收到天线[0,1]的信号,因此retf0,2]=1;
天线[0,3]可以接收到天线[0,2]的信号,因此ret[0,3]=1;
天线[0,4]可以接收到天线[0.3]的信号,因此ret[0,4]=1;
天线[0,5]可以接收到天线[0,1]、天线[0,2]、天线[0,3]、天线[0,4]的信号,因此ret[0,5]=4
天线[1,0]可以接收到天线[0,0]的信号,因此ret[1,0]=1;
天线[1,1]可以接收到天线[0,1]、天线[1,0]的信号,因此ret[1,1]=2;
天线[1,2]可以接收到天线[0,2]、天线[1,1]的信号,因此ret[1,2]=2;
天线[1,3]可以接收到天线[0,3]、天线[1,0]、天线[1,1]、天线[1,2]的信号,因此ret[1,3]=4;
天线[1,4]可以接收到天线[0,4]、天线[1,3]的信号,因此ret[1,4]=2;
天线[1,5]可以接收到天线[0,5]、天线[1,4]的信号,因此ret[1,5]=2

解题思路:

求天线接收信号的个数,如图:
在这里插入图片描述

如求[0,5]可接收的信号:
以左侧第一根天线为最大值max=[0,4]=2,可以接收到信号,count=1;
[0,3]=1<max,接收不到此天线的信号,count=1;
[0,2]=3==[0,5]>max,可以接收到信号,count=2,且max =3;
因为与接收天线等高,所以往后的天线都没有办法接收到信号了。所以count=2。

java代码:

代码解读:

这段代码是一个天线接收信号的问题。代码首先通过Scanner类从标准输入中读取行数和列数,然后初始化一个二维数组来存储输入的天线高度。接下来,代码循环计算每个天线的接收信号数,通过调用rowSignal和colSignal方法来计算行信号接收数和列信号接收数之和。最后,代码输出行数和列数,以及计算出的结果字符串。

rowSignal方法用于计算当前天线的行信号接收数。首先,代码判断当前天线是否在第一列,如果是,则没有行信号接收。然后,代码以当前天线左侧的第一根天线作为最大值,从当前天线左侧第二根天线开始往左遍历。如果最大高度大于等于接收天线,则后面的天线发射的信号都无法接收。如果当前天线的高度大于最大高度,则表示可以接收到信号,接收信号数加1,同时更新最大高度。最后,代码返回行信号接收数。

colSignal方法用于计算当前天线的列信号接收数。首先,代码判断当前天线是否在第一行,如果是,则没有列信号接收。然后,代码以当前天线上面的第一根天线为最大值,从当前天线上方第二根天线开始往上遍历。如果最大高度大于等于接收天线,则后面的天线发射的信号都无法接收。如果当前天线的高度大于最大高度,则表示可以接收到信号,接收信号数加1,同时更新最大高度。最后,代码返回列信号接收数。

import java.util.Scanner;

public class Main{
    public static int[][] ints; //定义一个二维数组,用于存储输入的天线高度
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int r = sc.nextInt(); //输入行数
        int c = sc.nextInt(); //输入列数
        ints = new int[r][c]; //初始化数组
        for(int i=0;i<r;i++){ //循环输入每个天线的高度
            for(int j=0;j<c;j++){
            ints[i][j] = sc.nextInt();
            }
        }
        String res = ""; //定义一个字符串,用于存储结果
        for(int i=0;i<r;i++){ //循环计算每个天线的接收信号数
            for(int j=0;j<c;j++){
                int count = rowSignal(i,j) + colSignal(i,j); //计算行信号接收数和列信号接收数之和
                res += count + " "; //将结果添加到字符串中
            }
        }
        System.out.println(r + " " + c); //输出行数和列数
        System.out.println(res.substring(0,res.length()-1)); //输出结果字符串,去掉最后一个空格
    }
    /**
     * 求行接收信号数
     * @param row 当前天线所在的行数
     * @param col 当前天线所在的列数
     * @return 返回当前天线的行信号接收数
     */
    public static int rowSignal(int row, int col){
        if(col==0){ //在第 1 列没有行信号接收
            return 0;
        }
        int max = ints[row][col-1]; //以此天线左侧的第一根天线作为最大值
        int count = 1; //左侧第一根一定能接收到信号,所以至少有 1 个
        for(int i=col-2; i>=0; i--){ //从当前天线左侧第二根天线开始往左遍历
            if(max >= ints[row][col]){ //当最大高度大于等于接收天线时,后面的天线发射的信号都无法接收
                break;
            }
            int height = ints[row][i]; //获取当前天线的高度
            if(height>max){  //此地的天线是当前最高天线时,表示可以接收到信号
                count++; //接收信号数加 1
                max = height; //更新最大高度
            }
        }
        return count; //返回行信号接收数
    }
    /**
     * 求列信号接收数
     * @param row 当前天线所在的行数
     * @param col 当前天线所在的列数
     * @return 返回当前天线的列信号接收数
     */
    public static int colSignal(int row, int col){ 
        if(row==0){ //在第 1 行没有列信号接收
            return 0;
        }
        int max = ints[row-1][col]; //以此天线上面的第一根天线为最大值
        int count = 1; //上侧第一根一定能接收到信号,所以至少有 1 个
        for(int i=row-2; i>=0; i--){ //从当前天线上方第二根天线开始往上遍历
            if(max >= ints[row][col]){ //当最大高度大于等于接收天线时,后面的天线发射的信号都无法接收
                break;
            }
            int height = ints[i][col]; //获取当前天线的高度
            if(height>max){  //此地的天线是当前最高天线时,表示可以接收到信号
                count++; //接收信号数加 1
                max = height; //更新最大高度
            }
        }
        return count; //返回列信号接收数
    }
}

C++代码:

#include <iostream>

using namespace std;

// 计算当前位置在行方向上的信号强度
int rowSignal(int row, int col, int** ints) {
    if(col == 0) {  // 如果当前位置在第一列,则无法向左计算信号强度
        return 0;
    }
    int max = ints[row][col-1];  // 初始化最大高度为当前位置左侧的高度
    int count = 1;  // 初始化信号强度为1
    for(int i=col-2; i>=0; i--) {  // 从当前位置左侧第二个位置开始向左遍历
        if(max >= ints[row][col]) {  // 如果当前位置的高度小于等于左侧位置的高度,则无法向左传递信号
            break;
        }
        int height = ints[row][i];  // 获取当前位置左侧的高度
        if(height > max) {  // 如果当前位置左侧的高度大于最大高度,则信号强度加1,并更新最大高度
            count++;
            max = height;
        }
    }
    return count;  // 返回信号强度
}

// 计算当前位置在列方向上的信号强度
int colSignal(int row, int col, int** ints) {
    if(row == 0) {  // 如果当前位置在第一行,则无法向上计算信号强度
        return 0;
    }
    int max = ints[row-1][col];  // 初始化最大高度为当前位置上方的高度
    int count = 1;  // 初始化信号强度为1
    for(int i=row-2; i>=0; i--) {  // 从当前位置上方第二个位置开始向上遍历
        if(max >= ints[row][col]) {  // 如果当前位置的高度小于等于上方位置的高度,则无法向上传递信号
            break;
        }
        int height = ints[i][col];  // 获取当前位置上方的高度
        if(height > max) {  // 如果当前位置上方的高度大于最大高度,则信号强度加1,并更新最大高度
            count++;
            max = height;
        }
    }
    return count;  // 返回信号强度
}

int main() {
    int r, c;
    cin >> r >> c;  // 输入矩阵的行数和列数
    int** ints = new int*[r];  // 动态分配二维数组的内存空间
    for(int i=0; i<r; i++) {
        ints[i] = new int[c];
    }
    for(int i=0; i<r; i++) {  // 输入矩阵的每个元素
        for(int j=0; j<c; j++) {
            cin >> ints[i][j];
        }
    }
    string res = "";  // 初始化结果字符串
    for(int i=0; i<r; i++) {  // 遍历矩阵的每个位置
        for(int j=0; j<c; j++) {
            int count = rowSignal(i, j, ints) + colSignal(i, j, ints);  // 计算当前位置的信号强度
            res.append(to_string(count) + " ");  // 将信号强度添加到结果字符串中
        }
    }
    cout << r << " " << c << endl;  // 输出矩阵的行数和列数
    cout << res.substr(0, res.length()-1) << endl;  // 输出结果字符串,去掉最后一个空格
    return 0;
}

python代码:

def rowSignal(row, col, ints):
    # 计算行信号
    if col == 0:
        return 0
    # 如果列数为0,返回0
    max_height = ints[row][col-1]
    # 初始化最大高度为当前位置左侧的高度
    count = 1
    # 初始化信号数量为1
    for i in range(col-2, -1, -1):
        # 从当前位置左侧第二个位置开始向左遍历
        if max_height >= ints[row][col]:
            # 如果当前位置左侧的高度大于等于当前位置的高度,跳出循环
            break
        height = ints[row][i]
        # 获取当前位置左侧的高度
        if height > max_height:
            # 如果当前位置左侧的高度大于最大高度,信号数量加1,最大高度更新为当前位置左侧的高度
            count += 1
            max_height = height
    return count

def colSignal(row, col, ints):
    # 计算列信号
    if row == 0:
        return 0
    # 如果行数为0,返回0
    max_height = ints[row-1][col]
    # 初始化最大高度为当前位置上方的高度
    count = 1
    # 初始化信号数量为1
    for i in range(row-2, -1, -1):
        # 从当前位置上方第二个位置开始向上遍历
        if max_height >= ints[row][col]:
            # 如果当前位置上方的高度大于等于当前位置的高度,跳出循环
            break
        height = ints[i][col]
        # 获取当前位置上方的高度
        if height > max_height:
            # 如果当前位置上方的高度大于最大高度,信号数量加1,最大高度更新为当前位置上方的高度
            count += 1
            max_height = height
    return count

# 主函数
if __name__ == '__main__':
    r, c = map(int, input().split())
    # 获取矩阵的行数和列数
    ints = []
    tmp_list = list(map(int, input().split()))
    # 获取矩阵中每个位置的高度
    for i in range(r):
        tmp = []
        for j in range(c):
            tmp.append(tmp_list[c * i + j])
        ints.append(tmp)
    res = ""
    # 初始化结果字符串
    for i in range(r):
        for j in range(c):
            count = rowSignal(i, j, ints) + colSignal(i, j, ints)
            # 计算当前位置的行信号和列信号之和
            res += str(count) + " "
            # 将结果添加到结果字符串中
    print(r, c)
    # 输出矩阵的行数和列数
    print(res[:-1])
    # 输出结果字符串,去掉最后一个空格

做题心得:

这段python代码又使用到了这段代码,和【华为OD机试真题】计算网络信号中的用法类似,请同学们务必掌握。

tmp_list = list(map(int, input().split()))
    # 获取矩阵中每个位置的高度
    for i in range(r):
        tmp = []
        for j in range(c):
            tmp.append(tmp_list[c * i + j])
        ints.append(tmp)

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

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

相关文章

【ROS仿真实战】获取机器人在gazebo位置真值的三种方法(三)

文章目录 前言一. 使用ROS tf库二、 使用Gazebo Model Plugin三、 使用libgazebo_ros_p3d插件四、总结 前言 在ROS和Gazebo中&#xff0c;获取机器人的位置信息通常通过ROS消息传递进行。在这篇文章中&#xff0c;我们将介绍三种获取机器人在Gazebo中位置真值的方法&#xff1…

CTF ASCII码 密码解密题 简单

1. 题目 这次的CTF题目就是一张图片如下&#xff0c;并且说有几个蛋被打乱过。明显是一个密码学的解码题。 2. 解题思路 左边表格给出10种颜色&#xff0c;特别是第二列给出了数字0&#xff0c;种种迹象都指向了10进制。每一个蛋都有三种颜色&#xff0c;代表每个蛋都是三位…

【GORM框架】一文学会用gorm实现对单表的增删改查操作

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: GORM框架学习 近期目标&#xff1a;写好专栏的每一篇文章 文章目录 一、…

M1 Mac配置JAVA环境

1、下载JDK 目前JDK有Oracle的JDK还有zulu的Open JDK可供选择&#xff0c;因为需要JAVA1.8所以下文以zulu的JDK为例。 Zulu官网&#xff1a;https://www.azul.com/downloads/?packagejdk 选择所需的JDK版本&#xff08;注意选择ARM架构&#xff09;> 下载.dmg包 > 安装 …

DAY 47 Ngnix优化与防盗链

Ngnix优化主要有两种&#xff0c;一种是配置上的优化&#xff0c;一种是内核上的优化 隐藏响应头中的版本号 方法一&#xff1a;curl命令 网页查看 隐藏版本信息 修改nginx的运行用户和组 方法一&#xff1a;在编译安装时&#xff0c;指定运行用户和组 [root nginx-1.12.2]#…

【英语】100个句子记完7000个雅思单词

其实主要的7000词其实是在主题归纳里面&#xff0c;不过过一遍100个句子也挺好的&#xff0c;反正也不多。 文章目录 Sentence 01Sentence 02Sentence 03Sentence 04Sentence 05Sentence 06Sentence 07Sentence 08Sentence 09Sentence 10Sentence 11Sentence 12Sentence 13Sent…

Linux常用的压缩、解压缩以及scp远程传输命令的使用

Linux常用的压缩、解压缩以及scp远程传输命令的使用 1.压缩命令2 解压命令3. 大文件压缩分割为多个压缩文件4. 远程传输命令scp4.1 将本地文件复制到远程主机目录4.2 将本地目录复制到远程主机目录4.3 将远程主机的文件复制到本机4.4 复制远程主机目录到本机 1.压缩命令 tar -…

Packet Tracer - 综合技能练习(配置新交换机的初始设置、SSH 和端口安全)

Packet Tracer - 综合技能练习 地址分配表 设备 接口 IP 地址 子网掩码 S1 VLAN 1 10.10.10.2 255.255.255.0 PC1 NIC 10.10.10.10 255.255.255.0 PC2 NIC 10.10.10.11 255.255.255.0 场景 网络管理员要求您配置新交换机。 在本练习中&#xff0c;您将使用一…

二分搜索算法通解框架

文章介绍了二分搜索最常见的几个场景的使用&#xff1a;寻找一个数、寻找左侧边界以及寻找右侧边界。阅读本文只需读者了解二分搜索的使用限制和基本原理即可。 我相信&#xff0c;友好的讨论交流会让彼此快速进步&#xff01;文章难免有疏漏之处&#xff0c;十分欢迎大家在评…

密码学【java】初探究加密方式之对称加密

文章目录 一 常见加密方式二 对称加密2.1 Cipher类简介2.2 Base算法2.3 补充&#xff1a;Byte&bit2.4 DES加密演示2.5 DES解密2.6 补充&#xff1a;对于IDEA控制台乱码的解决方法2.7 AES加密解密2.8 补充&#xff1a; toString()与new String ()用法区别2.9 加密模式2.9.1 …

MySQL学习笔记第六天

第06章多表查询 5. 7种SQL JOINS的实现 A是员工表&#xff0c;B是部门表。 5.7.1 代码实现 #8. UNION 和 UNION ALL的使用 # UNION&#xff1a;会执行去重操作 # UNION ALL:不会执行去重操作&#xff0c;效率优于前者&#xff0c;开发中优先使用 #结论&#xff1a;如果明确…

【Java入门合集】第二章Java语言基础(四——第二章结束)

【Java入门合集】第二章Java语言基础&#xff08;四——第二章结束&#xff09; 博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 掌握变量、常量、表达式的概念&#xff0c;数据类型及变量的定义方法&#xff1b; 掌握常用运算符的使用&#xff1b; 掌握程序的顺…

【LeetCode股票买卖系列:188. 买卖股票的最佳时机 IV | 暴力递归=>记忆化搜索=>动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Hibernate(一)——入门

在之前经常用到操作数据库的框架是Mybatis或者Mybatis-plus。 Hibernate在項目中用过&#xff0c;但没有深入的了解过&#xff0c;所以这次趁着假期把这个框架了解一下。 目录 概念Hibernate和Mybatis的区别Hibernate使用依赖引入Hibernate配置文件XML配置文件详解properties文…

2023 年 五一杯 B 题过程 + 代码(第一问)

文章目录 第一题问题分析PageRank 算法&#xff08;可跳过&#xff09;PageRank 算法修正权重系数 结果各城市链出与链入链出 权重链入 权重 PageRank 算法结果代码 第一题 问题分析 从收货量、发货量、快递数量增长/减少趋势、相关性等多角度考虑&#xff0c;建立数学模型&…

如何使用git更新别人的代码

文章目录 如何使用git更新别人的代码问题说明省流问题示例操作步骤总结总结 如何使用git更新别人的代码 问题说明 当自己git clone别人的代码之后&#xff0c;代码一直停留到本地电脑上&#xff0c;而你就跑了一次程序就搁置了。 后来有一天你想再次运行该代码&#xff0c;但…

可观测性:你的应用健康吗?

一、需求来源 首先来看一下&#xff0c;整个需求的来源&#xff1a;当把应用迁移到 Kubernetes 之后&#xff0c;要如何去保障应用的健康与稳定呢&#xff1f;其实很简单&#xff0c;可以从两个方面来进行增强&#xff1a; 首先是提高应用的可观测性&#xff1b;第二是提高应…

Matplotlib 安装介绍

文章目录 安装步骤 Matplotlib 不止是一个数学绘图库&#xff0c;它也是可视化和分析工具中最流行之一。我们可用其制作简单的图表&#xff0c;如折线图和散点图。 安装步骤 先进入&#xff1a;python官网 跳转到界面&#xff1a; 录入并搜索 下载之前&#xff0c;看一下自…

嵌入式linux学习笔记--虚拟局域网组网方案分享,基于自组zerotier -planet 网络的方案

0. 前言 五一假期期间重新考虑了目前的组网环境&#xff0c;准备对目前的组网进行一个重新的划分。 目前有的资源 ① 两台 服务器&#xff0c;阿里云-深圳&#xff08;5M上行&#xff09;和腾讯云 广州&#xff08;3M上行&#xff09; ② 带动态公网IP的家庭宽带 &#xff08;…

伽马校正的前世今生

关于伽马校正的前因后果&#xff0c;在网上有不同版本的说法&#xff0c;由于年代久远的因素&#xff0c;导致原本很简单的事情越说越复杂。今天我们的目标就是抓住伽马的头&#xff0c;而不是摸一下伽马的尾巴。 一&#xff0c;鱼龙混杂的论调 1&#xff0c;CRT 显示器的物理…