目录
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
- 先将[0,0]位置的值变为1。
- 第一次同化:
- 第二次同化:
大家好,我是哪吒。
一、题目描述
存在一个m*n的二维数组,其成员取值范围为0、1、2。
其中值为1的元素具备同化特性,每经过1秒,将上下左右值为0的元素同化为1。
而值为2的元素,免疫同化。
将数组所有成员随机初始化为0或2,再将矩阵的[0,0]元素修改为1,在经过足够长的时间后矩阵中有多少个元素是0或2,即0和2数量之和。
二、输入描述
输入的前两个数字是矩阵大小,后面是数字矩阵内容。
三、输出描述
返回矩阵中非1的元素个数。
四、解题思路
- 第一行输入矩阵二维数组大小m和n;
- 随后n行输入矩阵数组;
- [0,0]位置初始化为1;
- 建一个新的矩阵集合list;
- 将第一个1加入list;
- 每经过1秒,将上下左右值为0的元素同化为1;
- 最后输出非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 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。