1. 题目背景与核心需求
这道华为OD机考题考察的是矩阵处理能力,属于典型的二维数组操作类题目。题目给出一个由数字组成的矩阵,要求实现两个功能:
- 统计矩阵中非1元素的个数
- 将矩阵中所有与1相邻(上下左右)的元素同化为1
这类题型在实际开发中很常见,比如图像处理中的像素扩散、游戏开发中的地图染色、社交网络中的影响力传播等场景。题目特别要求用五种编程语言实现,考察的是开发者对不同语言语法特性的掌握程度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 问题分解
这个问题可以拆解为两个子任务:
- 遍历矩阵统计非1元素数量
- 实现数值同化扩散效果
第一个任务相对简单,只需要双重循环遍历即可。第二个任务需要考虑相邻元素的扩散效应,这类似于图像处理中的"洪水填充"算法。
2.2 算法选择
对于数值同化部分,有两种典型实现方式:
- 广度优先搜索(BFS):使用队列存储待处理的相邻元素
- 深度优先搜索(DFS):递归处理相邻元素
考虑到矩阵可能较大,BFS通常更节省内存且效率稳定。以下是BFS的基本流程:
- 遍历矩阵找到所有值为1的元素位置
- 将这些位置加入队列
- 从队列取出元素,检查其四个方向的相邻元素
- 如果相邻元素不为1,则将其设为1并加入队列
- 重复直到队列为空
3. 多语言实现对比
3.1 Java实现
java复制import java.util.LinkedList;
import java.util.Queue;
public class MatrixConverter {
public static int[] processMatrix(int[][] matrix) {
if (matrix == null || matrix.length == 0) return new int[]{0, 0};
int m = matrix.length, n = matrix[0].length;
int nonOneCount = 0;
Queue<int[]> queue = new LinkedList<>();
// 第一遍遍历:统计非1数量并记录1的位置
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] != 1) {
nonOneCount++;
} else {
queue.offer(new int[]{i, j});
}
}
}
// 边界情况处理
if (nonOneCount == 0) return new int[]{0, 0};
// BFS扩散
int[][] dirs = {{-1,0}, {1,0}, {0,-1}, {0,1}};
int converted = 0;
while (!queue.isEmpty()) {
int[] cell = queue.poll();
for (int[] dir : d
