华为OD机试 - 最大相连男生数 - 矩阵(Python/JS/C/C++ 2024 E卷 200分)

news2024/9/21 2:34:23

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

学校组织活动,将学生排成一个矩形方阵。请在矩形方阵中找到最大的位置相连的男生数量。

这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的.注:学生个数不会超过10000。

二、输入描述

输入的第一行为矩阵的行数和列数,接下来的n行为矩阵元素,元素间用","分隔。

三、输出描述

输出一个整数,表示矩阵中最长的位置相连的男生个数。

四、测试用例

测试用例1

1、输入

3,4
F,M,M,F
F,M,M,F
F,F,F,M

2、输出

3

测试用例2

1、输入

7,8
F,M,M,F,M,M,M,M
F,M,M,M,F,F,F,F
F,F,F,M,M,F,F,F
F,F,F,M,M,M,F,F
F,F,F,F,F,M,F,F
F,F,F,M,F,M,F,F
F,F,F,M,F,M,F,M

2、输出

5

五、解题思路

1、题目解析

本题的解题思路其实不难,遍历查找矩阵中每一个 M 点,然后求该 M 点的水平、垂直、正对角线、反对角线四个方向的 M 点个数,然后保留最大的个数

2、解体思路

  1. 定义矩阵matrix,并初始化;
  2. 定义矩阵中最长的位置相连的男生个数max;
  3. 遍历矩阵,并跳过女生M;
  4. 计算每行相连的男生个数;
  5. 计算每列相连的男生个数;
  6. 计算斜线相连的男生个数;
  7. 计算反斜线相连的男生个数;
  8. 相连最大值。

六、Python算法源码

def main():
    m, n = 0, 0  # 初始化行和列

    # 读取输入
    input_data = input().split(',')
    m = int(input_data[0])  # 矩阵的行数
    n = int(input_data[1])  # 矩阵的列数

    # 初始化矩阵
    matrix = []

    for i in range(m):
        line = input().split(',')  # 按逗号分隔每一行的输入
        matrix.append(line)  # 将每一行添加到矩阵中

    # 定义方向:{0,1}表示水平,{1,0}表示垂直,{1,1}表示斜向下,{1,-1}表示反斜线向下
    direction = [(0, 1), (1, 0), (1, 1), (1, -1)]

    # 记录矩阵中最长连续"M"的数量
    max_count = 0

    # 遍历整个矩阵
    for i in range(m):
        for j in range(n):
            if matrix[i][j] == "M":  # 如果当前元素是"M"
                for d in direction:
                    reverse_i = i - d[0]
                    reverse_j = j - d[1]

                    # 如果前一个位置包含'M',说明这个"M"已经计算过,跳过
                    if 0 <= reverse_i < m and 0 <= reverse_j < n and matrix[reverse_i][reverse_j] == "M":
                        continue

                    next_i = i + d[0]
                    next_j = j + d[1]
                    same = 1  # 计数当前连续的"M"

                    # 计算每一行、每一列、斜线和反斜线中连续的"M"的数量
                    while 0 <= next_i < m and 0 <= next_j < n and matrix[next_i][next_j] == "M":
                        same += 1
                        next_i += d[0]
                        next_j += d[1]

                    # 更新最大连续"M"的数量
                    max_count = max(max_count, same)

    # 输出结果
    print(max_count)


if __name__ == "__main__":
    main()

七、JavaScript算法源码

function main() {
    let m = 0, n = 0;  // 初始化行和列

    // 读取输入
    const input = prompt("请输入行数和列数(以逗号分隔):").split(",");
    m = parseInt(input[0]);  // 矩阵的行数
    n = parseInt(input[1]);  // 矩阵的列数

    // 初始化矩阵
    const matrix = [];

    for (let i = 0; i < m; i++) {
        const line = prompt(`请输入矩阵第${i + 1}行数据(以逗号分隔):`).split(",");  // 按逗号分隔每一行的输入
        matrix.push(line);  // 将每一行添加到矩阵中
    }

    // 定义方向:{0,1}表示水平,{1,0}表示垂直,{1,1}表示斜向下,{1,-1}表示反斜线向下
    const direction = [[0, 1], [1, 0], [1, 1], [1, -1]];

    // 记录矩阵中最长连续"M"的数量
    let maxCount = 0;

    // 遍历整个矩阵
    for (let i = 0; i < m; i++) {
        for (let j = 0; j < n; j++) {
            if (matrix[i][j] === "M") {  // 如果当前元素是"M"
                for (const d of direction) {
                    let reverseI = i - d[0];
                    let reverseJ = j - d[1];

                    // 如果前一个位置包含'M',说明这个"M"已经计算过,跳过
                    if (reverseI >= 0 && reverseI < m && reverseJ >= 0 && reverseJ < n && matrix[reverseI][reverseJ] === "M") {
                        continue;
                    }

                    let nextI = i + d[0];
                    let nextJ = j + d[1];
                    let same = 1;  // 计数当前连续的"M"

                    // 计算每一行、每一列、斜线和反斜线中连续的"M"的数量
                    while (nextI >= 0 && nextI < m && nextJ >= 0 && nextJ < n && matrix[nextI][nextJ] === "M") {
                        same++;
                        nextI += d[0];
                        nextJ += d[1];
                    }

                    // 更新最大连续"M"的数量
                    maxCount = Math.max(maxCount, same);
                }
            }
        }
    }

    // 输出结果
    console.log(maxCount);
}

// 运行主函数
main();

八、C算法源码

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

// 定义矩阵的最大尺寸
#define MAX_SIZE 100

int main() {
    int m, n; // 矩阵的行数和列数
    char matrix[MAX_SIZE][MAX_SIZE]; // 矩阵

    // 读取输入行数和列数
    printf("请输入行数和列数(以逗号分隔):");
    scanf("%d,%d", &m, &n);

    // 初始化矩阵
    for (int i = 0; i < m; i++) {
        printf("请输入矩阵第%d行数据(以逗号分隔):", i + 1);
        for (int j = 0; j < n; j++) {
            scanf(" %c", &matrix[i][j]);
            if (j < n - 1) getchar();  // 读取逗号分隔符
        }
    }

    // 定义方向:{0,1}表示水平,{1,0}表示垂直,{1,1}表示斜向下,{1,-1}表示反斜线向下
    int direction[4][2] = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};

    int maxCount = 0; // 记录矩阵中最长连续"M"的数量

    // 遍历整个矩阵
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] == 'M') {  // 如果当前元素是"M"
                for (int d = 0; d < 4; d++) {
                    int reverseI = i - direction[d][0];
                    int reverseJ = j - direction[d][1];

                    // 如果前一个位置包含'M',说明这个"M"已经计算过,跳过
                    if (reverseI >= 0 && reverseI < m && reverseJ >= 0 && reverseJ < n && matrix[reverseI][reverseJ] == 'M') {
                        continue;
                    }

                    int nextI = i + direction[d][0];
                    int nextJ = j + direction[d][1];
                    int same = 1;  // 计数当前连续的"M"

                    // 计算每一行、每一列、斜线和反斜线中连续的"M"的数量
                    while (nextI >= 0 && nextI < m && nextJ >= 0 && nextJ < n && matrix[nextI][nextJ] == 'M') {
                        same++;
                        nextI += direction[d][0];
                        nextJ += direction[d][1];
                    }

                    // 更新最大连续"M"的数量
                    if (same > maxCount) {
                        maxCount = same;
                    }
                }
            }
        }
    }

    // 输出结果
    printf("矩阵中最长连续的'M'的数量是: %d\n", maxCount);

    return 0;
}

九、C++算法源码

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

int main() {
    int m, n;  // 矩阵的行数和列数
    string input;

    // 读取输入行数和列数
    cout << "请输入行数和列数(以逗号分隔):" << endl;
    getline(cin, input);
    stringstream ss(input);
    string temp;

    // 使用字符串流分割输入数据
    getline(ss, temp, ',');
    m = stoi(temp);
    getline(ss, temp, ',');
    n = stoi(temp);

    // 初始化矩阵
    vector<vector<string>> matrix(m, vector<string>(n));
    for (int i = 0; i < m; i++) {
        cout << "请输入矩阵第" << i + 1 << "行数据(以逗号分隔):" << endl;
        getline(cin, input);
        stringstream ssRow(input);
        for (int j = 0; j < n; j++) {
            getline(ssRow, matrix[i][j], ',');  // 按逗号分隔每一行的输入
        }
    }

    // 定义方向:{0,1}表示水平,{1,0}表示垂直,{1,1}表示斜向下,{1,-1}表示反斜线向下
    vector<vector<int>> direction = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};

    int maxCount = 0;  // 记录矩阵中最长连续"M"的数量

    // 遍历整个矩阵
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] == "M") {  // 如果当前元素是"M"
                for (auto &d : direction) {
                    int reverseI = i - d[0];
                    int reverseJ = j - d[1];

                    // 如果前一个位置包含'M',说明这个"M"已经计算过,跳过
                    if (reverseI >= 0 && reverseI < m && reverseJ >= 0 && reverseJ < n && matrix[reverseI][reverseJ] == "M") {
                        continue;
                    }

                    int nextI = i + d[0];
                    int nextJ = j + d[1];
                    int same = 1;  // 计数当前连续的"M"

                    // 计算每一行、每一列、斜线和反斜线中连续的"M"的数量
                    while (nextI >= 0 && nextI < m && nextJ >= 0 && nextJ < n && matrix[nextI][nextJ] == "M") {
                        same++;
                        nextI += d[0];
                        nextJ += d[1];
                    }

                    // 更新最大连续"M"的数量
                    maxCount = max(maxCount, same);
                }
            }
        }
    }

    // 输出结果
    cout << "矩阵中最长连续的'M'的数量是: " << maxCount << 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/2109368.html

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

相关文章

[数据集][目标检测]水面垃圾检测数据集VOC+YOLO格式2027张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2027 标注数量(xml文件个数)&#xff1a;2027 标注数量(txt文件个数)&#xff1a;2027 标注…

信创实践(3):基于x2openEuler将CentOS升级成openEuler,享受其带来的创新和安全特性

引言&#xff1a; 在当前的 IT 行业中&#xff0c;创新和安全性是两大关键趋势。随着 CentOS 停止维护&#xff0c;许多用户正在寻找替代方案&#xff0c;以保持其系统的更新和安全。openEuler 作为一个强大的开源操作系统&#xff0c;成为了理想的迁移目标。本教程将指导您如…

大语言模型的上下文窗口(Context Windows):对人工智能应用的影响

大语言模型&#xff08;LLMs&#xff09;极大地提升了人工智能在理解和生成类人文本方面的能力。其中一个影响其效用的基本方面是它们的 “上下文窗口”—— 这个概念直接影响着这些模型接收和生成语言的有效性。我将深入探讨上下文窗口是什么、它们对人工智能应用的影响以及组…

【通俗理解】Baseline在竞赛中的意义——性能比较的标准尺

【通俗理解】Baseline在竞赛中的意义——性能比较的标准尺 关键词提炼 #Baseline #竞赛标准 #算法性能 #性能比较 #改进评估 #魔改基础 #优势彰显 第一节&#xff1a;Baseline的类比与核心概念【尽可能通俗】 1.1 Baseline的类比 Baseline在竞赛中就像是一场跑步比赛的起跑…

【IEEE独立出版 | 最终截稿时间:2024年9月9日23:59】第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024)

【IEEE独立出版 | 最终截稿时间&#xff1a;2024年9月9日23:59】 第三届人工智能、物联网和云计算技术国际会议&#xff08;AIoTC 2024&#xff09; 2024 3rd International Conference on Artificial Intelligence, Internet of Things and Cloud Computing Technology 202…

轻松驾驭开学季,智慧校园综合解决方案!

智慧校园是指运用先进的信息技术手段和智能化系统&#xff0c;对学校内部各种教育资源、管理流程和服务进行数字化、网络化、智能化的整合与优化&#xff0c;提供高效便捷的教育教学和管理服务环境的校园。 智慧校园建设从哪些方面入手呢&#xff1f; 1.智慧食堂管理系统 基于…

[3.4]【机器人运动学MATLAB实战分析】平面RRR机器人正运动学MATLAB计算

本文重点介绍平面RRR机械手结构的正运动学方程的算例,这些是工业机器人中经常遇到的。平面RRR机器人运动学建模如下: 机器人模型: 表1三连杆平面臂的DH参数 由于所有关节都是转动型的,对每一个关节都具有相同的定义的齐次变换矩阵结构,即: 则计算正运动学方程得:

xAI巨无霸超级计算机上线:10万张H100 GPU,计划翻倍至20万张

在短短四个多月的时间里&#xff0c;埃隆马斯克的X公司&#xff08;前身为Twitter&#xff09;推出了世界上最强劲的人工智能训练系统。名为Colossus的超级计算机使用了多达10万张NVIDIA H100 GPU进行训练&#xff0c;并计划在未来几个月内再增加5万张H100和H200 GPU。 “本周末…

时间序列神器Prophet教程-入门教程

公众号&#xff1a;尤而小屋编辑&#xff1a;Peter作者&#xff1a;Peter 大家好&#xff0c;我是Peter~ 今天给大家分享一个时间序列预测神器Prophet的简易入门教程。 什么是Prophet Prophet是一种基于加法模型的时间序列预测工具&#xff0c;由Facebook的数据科学团队开发…

实战训练与源码教程:用Real-ESRGAN对抗生成超分技术实现超高清图像!

目录 前言 超分数据如何构造呢&#xff1f; Real-ESRGAN 1. 高质量细节重建 2. 真实感和自然度 3. 处理真实世界数据 4. 多尺度和多种类型的输入 5. 视觉效果的提升 超分如何退化 1. 模糊处理 2. 噪声处理 3. 压缩失真 4. 训练数据的退化模拟 2.经典退化模型◆退…

【苍穹外卖】Day 7 缓存、购物车相关接口

1 缓存 存在问题&#xff1a; 用户端小程序展示的菜品数据都是通过査询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 >解决&#xff1a; 通过 Redis 来缓存菜品数据&#xff0c;减少数据库查询操作 缓存逻辑分析&#xff1a; 每个分…

PyDracula:用 PySide6 和 PyQt6打造现代感 Python GUI 的利器

PyDracula 是一个基于 PySide6 或 PyQt6 的 Python GUI 库&#xff0c;它以其现代、美观、易于定制的特点而闻名。PyDracula 融合了流行的 Dracula 主题&#xff0c;并提供了丰富的功能&#xff0c;让开发者可以轻松构建出具有吸引力的图形界面。本文将详细介绍 PyDracula 的核…

【Godot4.3】CanvasShape资源化改造

概述 通过把之前自定义的CanvasShape类变成资源类型&#xff0c;将可以同时用于CanvasItem绘图和创建扩展的Node2D和Polygon2D节点等。 本篇就完成CanvasShape类的资源化改造&#xff0c;并记录改造过程和思路。 CanvasShape资源类型体系 CanvasShape仍然为图形基类&#xf…

Android Auto未来可能支持无线电广播

通过Android Auto&#xff0c;可以在车载收音机上使用 Google 地图、音乐、收听播客&#xff0c;还能获取天气等基本信息。最近&#xff0c;国外科技媒体9to5Google通过分析 Android Auto v12.3 和 v12.4的应用程序的代码发现了一些提示信息&#xff0c;特别提到了 AM、FM、HD …

【Protobuf】xml、json与protobuf有什么区别,protobuf详解(保姆篇)

文章目录 简介Protobuf 的原理安装 Protobuf 编译器在 Python 中使用 Protobuf安装语言特定的 Protobuf 库定义消息结构生成代码使用 Protobuf 进行序列化和反序列化 在 Java 中使用 Protobuf安装和配置编译 .proto 文件使用生成的 Java 类创建和序列化对象 代码注释 高级特性嵌…

LabVIEW灵活集成与调试的方法

在LabVIEW开发中&#xff0c;为了构建一个既便于调试又能灵活集成到主VI中的控制VI&#xff0c;开发者需要采用适当的编程方式和架构。常见的选择包括模块化设计、状态机架构以及事件驱动编程。这些方法有助于简化调试过程、提高系统的稳定性&#xff0c;并确保代码的重用性和可…

day43-测试平台搭建之前端vue学习-基础2

目录 一、数据代理 二、事件处理 三、计算属性 四、监控属性 五、绑定样式 六、今日学习思维导图 一、数据代理 1.1.数据代理&#xff1a;通过一个对象代理对另外一个对象中属性的操作 (读/写) 1.2.Vue中数据代理的好处&#xff1a;更加方便的操作data中的数据 1.3.基本原…

vue2结合element-ui使用tsx格式实现formily自定义组件

简洁 在公司实习&#xff0c;需要参与开发一个基于formily的低代码平台&#xff0c;实现自定义formily组件&#xff0c;在此记录一下。 示例源码 demo源码 实现思路 开始实现自定义组件之前最好先看一下formily官网的core、vue、element部分&#xff0c;如果有能力也可以阅…

2024数学建模国赛A题word版成品论文30页【附带完整解题代码+可视化图表】

0906 0:30 v1.0 问题一、问题二的完整可运行代码&#xff0c;模型建立与求解这一部分的论文。 0906 5:20 v1.1 增加了第三问的完整可运行代码和第二、三问的“模型建立与求解”的论文。&#xff08;即1-3问的代码、模型建立与求解、算法设计、结果分析&#xff09; 1-4问完整可…

TensorFlow创建回归神经网络及Optimizer优化器

一.TensorFlow创建神经层 如图所示&#xff0c;通过该神经网络识别动物猫或狗&#xff0c;共包括输入层&#xff08;Input Layer&#xff09;、隐藏层3层&#xff08;Hidden Layer&#xff09;和输出层&#xff08;Output Layer&#xff09;。其中每个隐藏层神经元都有一个激励…