华为OD机试真题 Java 实现【宜居星球改造计划】【2023 Q2 200分】,附详细解题思路-LMLPHP


大家好,我是哪吒。

做技术,我是认真的,立志于打造最权威的华为OD机试真题专栏,帮助那些与我有同样需求的人(考华为OD机试,升职加薪),每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑

华为OD机试(JAVA)真题(A卷+B卷)

一、题目描述

2XXX年,人类通过对火星的大气进行宜居改造分析,使得火星已在理论上具备人类宜居的条件;

由于技术原因,无法一次性将火星大气全部改造,只能通过局部处理形式;

假设将火星待改造的区域为row *column的网格,每个网格有3个值,宜居区、可改造区、死亡区,使用YES、NO、NA代替,YES表示该网格已经完成大气改造,NO表示该网格未进行改造,后期可进行改造,NA表示死亡区,不作为判断是否改造完的宜居,无法穿过;

初始化下,该区域可能存在多个宜居区,并目每个宜居区能同时在每个大阳日单位向上下左右四个方向的相邻格子进行扩散,自动将4个方向相邻的真空区改造成宜居区;

请计算这个待改造区域的网格中,可改造区是否能全部成宜居区,如果可以,则返回改造的大阳日天教,不可以则返回-1

二、输入描述

输入row * column个网格数据,每个网格值枚举值如下: YES,NO,NA;

三、输出描述

可改造区是否能全部变成宜居区,如果可以,则返回改造的太阳日天数,不可以则返回-1。

四、解题思路

  1. 第一行输入一共有几行数据;
  2. 定义一个集合list,将数据全部加载进去;
  3. 定义一个集合yesLists,存储宜居区;
  4. 定义一个noCount,记录不是宜居区的数量;
  5. 并遍历全数据集合list,初始化yesLists和noCount;
  6. 考虑特殊情况,①没有宜居区YES,②全是宜居区YES;
  7. 遍历宜居区集合yesLists,自动将4个方向相邻的真空区改造成宜居区;
  8. 输出改造次数;

五、Java算法源码

package com.guor.od;

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

public class OdTest {
    private static final String YES = "YES";
    private static final String NO = "NO";
    private static final String NA = "NA";

    public static int[][] directionArrs = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};

    public static void main(String[] args) {
        // 处理输入
        Scanner sc = new Scanner(System.in);
        // 输入一共有几行数据
        int row = Integer.valueOf(sc.nextLine());

        ArrayList<String[]> list = new ArrayList<>();
        for (int i = 0; i < row; i++) {
            String line = sc.nextLine();
            list.add(line.split(" "));
        }

        // 每一行有多少个
        int column = list.get(0).length;
        // 宜居区集合
        List<int[]> yesLists = new ArrayList<>();
        // 不是宜居区的数量
        int noCount = 0;

        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                // 宜居区集合
                if (list.get(i)[j].equals(YES)) {
                    yesLists.add(new int[]{i, j});
                } else {
                    // 不是宜居区的数量
                    noCount++;
                }
            }
        }

        // 没有宜居区YES
        if (yesLists.size() == 0) {
            System.out.println(-1);
            return;
        }

        // 全是宜居区YES
        if (yesLists.size() == row * column) {
            System.out.println(0);
            return;
        }

        // 改造次数
        int times = 0;

        while (yesLists.size() > 0 && noCount > 0) {
            // 新宜居区集合
            List<int[]> yesNewLists = new ArrayList<int[]>();
            for (int[] yesArr : yesLists) {
                for (int i = 0; i < 4; i++) {
                    int x = yesArr[0] + directionArrs[i][0];
                    int y = yesArr[1] + directionArrs[i][1];

                    // 自动将4个方向相邻的真空区改造成宜居区
                    if (x >= 0 && x < row && y >= 0 && y < column && NO.equals(list.get(x)[y])) {
                        list.get(x)[y] = YES;
                        yesNewLists.add(new int[]{x, y});
                        noCount--;
                    }
                }
            }

            times++;
            yesLists = yesNewLists;
        }

        // 可改造区是否能全部成宜居区
        System.out.println(noCount == 0 ? times : -1);
    }
}

六、效果展示

1、输入

4
YES YES NO NO
NO YES NO NO
YES NO NO YES
NO NO NO NO

2、输出

2

3、说明

经过 2 个太阳日,完成宜居改造。

第一个太阳日改造变为:

YES YES YES NO
YES YES YES NO
YES YES YES YES
YES NO NO YES

华为OD机试真题 Java 实现【宜居星球改造计划】【2023 Q2 200分】,附详细解题思路-LMLPHP

第二个太阳日改造变为:

YES YES YES YES
YES YES YES YES
YES YES YES YES
YES YES YES YES


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

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

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

华为OD机试真题 Java 实现【宜居星球改造计划】【2023 Q2 200分】,附详细解题思路-LMLPHP

07-11 04:13