【华为机试真题Java】矩阵扩散

这篇博客介绍了华为机试中的一道Java编程题目,涉及矩阵扩散算法。题目要求在一个m*n的二维数组中,从两个初始点开始,值为1的元素会扩散到相邻的0元素,最终所有元素变为1,求所需时间。输入包括矩阵大小和两个扩散点位置,输出是扩散完成所需的秒数。示例解释了扩散过程和得分规则,并提供了机试的时间分配建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

题目描述

输入描述

输出描述

参考示例

参考代码

机试介绍

写在最后


题目描述

存在一个mn的二维数组,其成员取值范围为0或1。其中值为1的成员具备扩散性,每经过1S,将上下左右值为0的成员同化为1。二维数组的成员初始值都为0,将第[i,j]和[k,l]两个个位置上元素修改成1后,求矩阵的所有元素变为1需要多长时间。

输入描述

输出数据中的前2个数字表示这是一个mn的矩阵,m和n不会超过1024大小;中间两个数字表示一个初始扩散点位置为i,j;最后2个数字表示另一个扩散点位置为k,l。

输出描述

输出矩阵的所有元素变为1所需要秒数。

参考示例

示例1:

输入

4,4,0,0,3,3

输出

3

说明

输出数据中的前2个数字表示这是一个4*4的矩阵;中间两个数字表示一个初始扩散点位置为0,0;最后2个数字表示另一个扩散点位置为3,3。

给出的样例是一个很简单模型,初始点在对角线上,达到中间的位置分别为3次迭代,即3秒。所以输出为3。

### 华为 Java 真题及相关练习 华为OD对于编程语言的选择并没有严格限制,但基于大多数应聘者的实际情况和技术背景,Java 被认为是一个相对合适的选择[^1]。以下是关于华为中的 Java 真题以及相关练习的内容。 #### 一、真题分类 根据已有的资料整理,华为OD的题目通常分为以下几个类别: - **字符串处理** - **数组操作** - **动态规划** - **贪心算法** - **图论** 这些类型的题目覆盖了计算科学的基础知识点,并且考察的是实际解决问题的能力而非单纯的理论记忆。 #### 二、经典真题解析——“2022Q4 路灯照明问题” 这是一道典型的华为OD题,难度较高,能够很好地反映其考查重点。 ##### 题目描述 给定一条街道上的若干盏路灯及其对应的亮度范围,求最少需要开启多少盏路灯才能照亮整条街。 ##### 输入描述 输入包含多组测数据,每组测数据的第一行为两个正整数 N 和 L (N ≤ 1e5, L ≤ 1e9),分别表示路灯的数量和街道长度;接下来的一行有 N 对整数 ai bi (-L/2 ≤ ai ≤ L/2, 0 < bi ≤ L),其中 ai 表示第 i 盏路灯的位置坐标,bi 表示该路灯能照射的最大距离。 ##### 输出描述 输出一个整数,即满足条件所需的最小路灯数量。 ##### 解题思路 此问题可以通过贪心策略解决。具体来说,先按照路灯位置排序,然后依次选取当前未被覆盖区域中最优的一个路灯进行点亮,直到整个区间都被完全覆盖为止[^2]。 ##### Java 实现代码 以下提供了上述问题的一种可能实现方式: ```java import java.util.*; public class StreetLight { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 路灯数目 long l = scanner.nextLong(); // 街道总长 List<int[]> lights = new ArrayList<>(); for(int i=0;i<n;i++) { int a = scanner.nextInt(); int b = scanner.nextInt(); lights.add(new int[]{a,b}); } Collections.sort(lights,(o1,o2)->{ if(o1[0]!=o2[0]) return o1[0]-o2[0]; else return o1[1]-o2[1]; }); long start = -l / 2; long end = -l / 2; int count = 0; int index = 0; while(end<l/2){ long maxEnd=-l/2; boolean flag=false; while(index<lights.size() && lights.get(index)[0]<=end+lights.get(index)[1]){ if(start<=lights.get(index)[0]-(long)lights.get(index)[1]){ maxEnd=Math.max(maxEnd,lights.get(index)[0]+(long)lights.get(index)[1]); flag=true; } index++; } if(!flag){ System.out.println(-1);return ; }else{ count++; end=maxEnd; } } System.out.println(count); } } ``` 以上代码实现了通过贪心法计算所需最少路灯数量的功能[^2]。 #### 三、其他推荐练习题 除了上述提到的经典题外,还可以尝以下几种常见类型的问题作为额外训练材料: 1. 字符串匹配与替换; 2. 数组旋转或翻转; 3. 最短路径寻找; 4. 排序算法优化实践等。 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

forest_long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值