华为OD机试 - 学生方阵 - 矩阵(Java 2023 B卷 200分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 1、输入
      • 2、输出
    • 四、解题思路
      • 1、题目解析
      • 2、解体思路
    • 五、Java算法源码
      • 再重新读一遍题目,看看能否优化一下~
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

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

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

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

二、输入描述

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

三、输出描述

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

1、输入

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

2、输出

3

四、解题思路

1、题目解析

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

2、解体思路

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

五、Java算法源码

public class OdTest03 {static int m, n = 0;public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] input = sc.nextLine().split(",");// m行m = Integer.valueOf(input[0]);// n列n = Integer.valueOf(input[1]);// 矩阵String[][] matrix = new String[m][n];for (int i = 0; i < m; i++) {String[] line = sc.nextLine().split(",");for (int j = 0; j < n; j++) {matrix[i][j] = line[j];}}// 矩阵中最长的位置相连的男生个数int max = 0;// 遍历矩阵for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {String compare = matrix[i][j];// 跳过女生Mif (compare.equals("F")) {continue;}// 计算每行相连的男生个数int rowSame = getSameRowMax(matrix, compare, i, j);// 计算每列相连的男生个数int columnSame = getSameColumnMax(matrix, compare, i, j);// 计算斜线相连的男生个数int obliqueSame = getSameObliqueMax(matrix, compare, i, j);// 计算反斜线相连的男生个数int reverseObliqueSame = getSameReverseObliqueMax(matrix, compare, i, j);int maxSame = Integer.max(Integer.max(columnSame, rowSame), Integer.max(obliqueSame, reverseObliqueSame));if (maxSame >= max) {max = maxSame;}}}System.out.println(max);}/*** 计算每行相连的男生个数** @param matrix  矩阵* @param compare 待比较字符* @param i       行* @param j       列* @return 相连的男生个数*/private static int getSameRowMax(String[][] matrix, String compare, int i, int j) {int same = 1;for (int k = j + 1; k < n; k++) {// 比较同一行中下一列字符if (compare.equals(matrix[i][k])) {same++;} else {// 如果不同,终止遍历,返回当前行相连的男生个数break;}}return same;}// 计算每列相连的男生个数private static int getSameColumnMax(String[][] matrix, String compare, int i, int j) {int same = 1;for (int k = i + 1; k < m; k++) {// 比较同一列中的下一行字符if (compare.equals(matrix[k][j])) {same++;} else {// 如果不同,终止遍历,返回当前列相连的男生个数break;}}return same;}// 计算斜线相连的男生个数private static int getSameObliqueMax(String[][] matrix, String compare, int i, int j) {int same = 1;for (int k = i + 1; k < m; k++) {for (int l = j + 1; l < n; l++) {// 比较下一行下一列处于斜线上的下一个字符if (compare.equals(matrix[k][l])) {same++;} else {// 如果不同,终止遍历,返回当前斜线相连的男生个数return same;}break;}}return same;}// 计算反斜线相连的男生个数private static int getSameReverseObliqueMax(String[][] matrix, String compare, int i, int j) {if (i == 0) {return 1;}int same = 1;for (int k = i + 1; k < m; k++) {for (int l = j - 1; l >= 0; l--) {// 比较下一行下一列处于斜线上的下一个字符if (compare.equals(matrix[k][l])) {same++;} else {// 如果不同,终止遍历,返回当前斜线相连的男生个数return same;}break;}}return same;}
}

感觉这道题,不至于这么复杂吧。

再重新读一遍题目,看看能否优化一下~

优化关键点:

  1. 定义方向二位数组direction;
  2. 遍历矩阵,如果前一个是M,表示此M已经计算过了,直接跳过;
  3. 简化上面的4种遍历方法,通过累加direction中的横纵坐标,计算每行、每列、斜线、反斜线相连的男生个数,并取相连最大值。
public class OdTest {static int m, n = 0;public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] input = sc.nextLine().split(",");// m行m = Integer.valueOf(input[0]);// n列n = Integer.valueOf(input[1]);// 矩阵String[][] matrix = new String[m][n];for (int i = 0; i < m; i++) {String[] line = sc.nextLine().split(",");for (int j = 0; j < n; j++) {matrix[i][j] = line[j];}}/*** 数组的第0位-行、数组的第1位-列* {0,1}寻找一行内连续的M* {1,0}寻找一列中连续的M* {1,1}寻找斜下中连续的M* {1,-1}寻找反斜下连续的M*/int[][] direction = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};// 矩阵中最长的位置相连的男生个数int max = 0;// 遍历矩阵for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j].equals("M")) {for (int[] arr : direction) {int reverseI = i - arr[0];int reverseJ = j - arr[1];// 如果前一个是M,表示此M已经计算过了,直接跳过if (reverseI >= 0 && reverseI < m && reverseJ >= 0 && reverseJ < n && matrix[reverseI][reverseJ].equals("M")) {continue;}int nextI = i + arr[0];int nextJ = j + arr[1];int same = 1;// 计算每行、每列、斜线、反斜线相连的男生个数,并取相连最大值while (nextI >= 0 && nextI < m && nextJ >= 0 && nextJ < n && matrix[nextI][nextJ].equals("M")) {same++;nextI += arr[0];nextJ += arr[1];}max = Integer.max(max, same);}}}}System.out.println(max);}
}

六、效果展示

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

3、说明

在这里插入图片描述


🏆下一篇:华为OD机试 - 最长的顺子 - 感谢@禁止你发言提供的更简便算法(Java 2023 B卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPU性能实时监测的实用工具

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

DataProcess-VOC数据图像和标签一起进行Resize

VOC数据图像和标签一起进行Resize 参加检测比赛的时候&#xff0c;很多时候工业原始数据尺度都比较大&#xff0c;如果对数据不提前进行处理&#xff0c;会导致数据在加载进内存时花费大量的时间&#xff0c;所以在执行训练程序之前需要将图像提前进行预处理。对于目标检测的数…

《Nature》预测 2024 科技大事:GPT-5预计明年发布等

《Nature》杂志近日盘点了 2024 年值得关注的科学事件&#xff0c;包括 GPT-5 与新一代 AlphaFold、超算 Jupiter、探索月球任务、生产「超级蚊子」、朝向星辰大海、试验下一代新冠疫苗、照亮暗物质、意识之辩第二回合、应对气候变化。 今年以来&#xff0c;以 ChatGPT 为代表…

63. 不同路径 II 23.12.21(二)

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到右下角…

Flutter基建 - 12种隐式动画小组件全解析

本篇基于Flutter 3.16.4&#xff0c;Dart 3.2.3版本 Flutter 3.16.4 • channel stable • Framework • revision 2e9cb0aa71 (3 days ago) • 2023-12-11 14:35:13 -0700 Engine • revision 54a7145303 Tools • Dart 3.2.3 • DevTools 2.28.4 本篇为Flutter基建的第九篇文…

【MySQL基础】:超详细MySQL完整安装和配置教程

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. MySQL数据库1.1 版本1.2 下载1.3 安装1.4 客户端连接 &#x1f324;️全篇总…

尺寸公差分析与尺寸链计算软件-DTAS3D到底能给我们带来哪些价值?

【技能】DTAS3D能给我们带来哪些价值&#xff1f; DTAS3D是一款高度集成的公差分析软件&#xff0c;旨在为产品开发团队提供准确的建议&#xff0c;从而放心地将设计发布给制造部门。下面是DTAS3D的关键价值和应用: 1.与三维CAD无缝集成: DTAS3D与三维CAD软件 (CATIA、NX、Cr…

为什么我的网络这么卡卡卡卡卡?(网络调试篇)

前言 最近小白迷上了打游戏。 有没有一起上王者的小伙伴&#xff1f; 有没有一起吃鸡的小伙伴&#xff1f; 欧耶&#xff0c; 咱们组队 送人头去吧 为了不让对方太菜&#xff0c; 送人头是与对方最高的敬意。 闲话说到这&#xff0c;本文就结束了。 感谢观看&#xff5e;…

使用Selenium库模拟浏览器操作

Selenium是一个用于自动化Web浏览器的Python库。它提供了一组强大的工具和API&#xff0c;使开发者能够以编程方式控制浏览器的行为&#xff0c;模拟用户与网页的交互。 Selenium可以用于各种Web自动化任务&#xff0c;包括网页测试、数据采集、UI自动化等。它支持主流的Web浏览…

Selenium自动化测试框架(附教程+源码)

说起自动化测试&#xff0c;我想大家都会有个疑问&#xff0c;要不要做自动化测试&#xff1f; 自动化测试给我们带来的收益是否会超出在建设时所投入的成本&#xff0c;这个嘛别说是我&#xff0c;即便是高手也很难回答&#xff0c;自动化测试的初衷是美好的&#xff0c;而测试…

山海鲸开发者视角:帮助汽车制造商取得市场优势

山海鲸可视化是一款致力于数字孪生领域的产品&#xff0c;为各行各业提供专业的数据可视化解决方案。作为山海鲸开发者&#xff0c;我们在开发免费好用的数字孪生工具同时也希望能让大家通过多种解决方案了解我们软件的多种可能性&#xff0c;本文就为大家介绍我们的汽车行业解…

U盘加密软件下载安装步骤

随着移动存储设备的普及&#xff0c;U盘已成为我们工作和生活中不可或缺的存储工具。然而&#xff0c;U盘丢失或被盗的风险也随之增加&#xff0c;如何保护U盘中的敏感数据成为了重要的问题。此时&#xff0c;U盘加密软件成为了解决这一问题的有效手段。 下面&#xff0c;我们…