华为OD机试真题 Java 实现【矩阵中非1的元素个数】【2023 B卷 200分】,附详细解题思路-LMLPHP

大家好,我是哪吒。

一、题目描述

存在一个m*n的二维数组,其成员取值范围为0、1、2。

其中值为1的元素具备同化特性,每经过1秒,将上下左右值为0的元素同化为1。

而值为2的元素,免疫同化。

将数组所有成员随机初始化为0或2,再将矩阵的[0,0]元素修改为1,在经过足够长的时间后矩阵中有多少个元素是0或2,即0和2数量之和。

二、输入描述

输入的前两个数字是矩阵大小,后面是数字矩阵内容。

三、输出描述

返回矩阵中非1的元素个数。

四、解题思路

  1. 第一行输入矩阵二维数组大小m和n;
  2. 随后n行输入矩阵数组;
  3. [0,0]位置初始化为1;
  4. 建一个新的矩阵集合list;
  5. 将第一个1加入list;
  6. 每经过1秒,将上下左右值为0的元素同化为1;
  7. 最后输出非1的个数;

五、Java算法源码

package com.guor.od;

import java.util.Scanner;
import java.util.*;

public class OdTest {
    public static int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 二维数组大小
        int m = sc.nextInt();
        int n = sc.nextInt();

        // 控制台输入的矩阵集合
        int[][] arrs = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                arrs[i][j] = sc.nextInt();
            }
        }

        // [0,0]位置初始化为1
        arrs[0][0] = 1;

        // 新的矩阵集合
        LinkedList<int[]> list = new LinkedList<>();

        list.add(new int[]{0, 0});

        // 1的个数
        int count = 1;

        // 每经过1秒,将上下左右值为0的元素同化为1
        while (list.size() > 0) {
            int[] pos = list.removeFirst();

            int x = pos[0];
            int y = pos[1];

            for (int i = 0; i < 4; i++) {
                int new_x = x + directions[i][0];
                int new_y = y + directions[i][1];

                if (new_x >= 0 && new_x < m && new_y >= 0 && new_y < n && arrs[new_x][new_y] == 0) {
                    arrs[new_x][new_y] = 1;
                    count++;
                    list.add(new int[]{new_x, new_y});
                }
            }
        }

        // 输出非1的个数
        System.out.println(m * n - count);
    }
}

六、效果展示

1、输入

3 3
0 0 0
0 0 2
0 2 0

2、输出

3

3、说明

每经过1秒,将1上下左右值为0的元素同化为1,2不可同化。

先将[0,0]位置的值变为1。

3 3
1 0 0
0 0 2
0 2 0

第一次同化:

3 3
1 1 0
1 0 2
0 2 0

第二次同化:

3 3
1 1 1
1 1 2
1 2 0

无法再次同化,输入2 和 0 的总数,即为3。

华为OD机试真题 Java 实现【矩阵中非1的元素个数】【2023 B卷 200分】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试真题 Java 实现【矩阵中非1的元素个数】【2023 B卷 200分】,附详细解题思路-LMLPHP

07-12 11:26