• 【华为OD机试-计算疫情扩散时间-Java】


    华为OD机试-计算疫情扩散时间-Java

    题目描述

    题目名称:计算疫情扩散时间
    时间限制:限制时间C/C++ 1秒,其他/Java 2s以内
    内存限制:32768K

    题目描述: 在一个地图中(地图由n*n个区域组成),有部分区域被感染病菌。感染区域每天都会把周围(上下左右)的4个区域感染。 请根据给定的地图计算,多少天以后,全部区域都会被感染。

    如果初始地图上所有区域全部都被感染,或者没有被感染区域,返回-1。

    输入描述: 一行N*N个数字(只包含0,1,不会有其他数字)表示一个地图,数字间用,分割,0表示未感染区域,1表示已经感染区域 每N个数字表示地图中一行,输入数据共表示N行N列的区域地图。 例如输入1,0,1,0,0,0,1,0,1,表示地图 1,0,1 0,0,0
    1,0,1
    输出描述: 一个整数,表示经过多少天以后,全部区域都被感染

    示例1
    输入
    1,0,1,0,0,0,1,0,1
    输出
    2
    说明
    1天以后,地图中仅剩余中心点未被感染;2天以后,全部被感染。

    示例2
    输入
    0,0,0,0
    输出
    -1
    说明
    无感染区域

    示例3
    输入
    1,1,1,1,1,1,1,1,1
    输出
    -1
    说明
    全部都感染

    备注: 1<=N<200

    题目解答(测试用例通过率100%)

    import java.util.*;
    
    public class Main{
        
        // 限制时间C/C++ 1秒,其他/Java 2s以内
        // 优化思路,把繁琐的数组转字符串判断是否包含0,
        // 改为抽象一个检查数组判断包含0的方法,
        // 去除转字符串数组,再转字符串的繁琐过程
        
        //检查区域是否已经全部被污染
        public static int isCheck(int[][] source,int n){
            for(int i = 0;i < n;i++){
                for(int j = 0;j <n;j++){
                    if(source[i][j]==0){
                        return 0;
                    }
                }
            }
            return 1;
        }
        
        //污染过程
        public static int[][] black(int[][] source,int n){
            
            //临时数组,保存改变的数组temp,source为原数组,作为基点,查找相邻污染点
            int[][] temp = new int[n][n];
            for(int i = 0;i < n;i++){
                for(int j = 0;j <n;j++){
                    temp[i][j]=source[i][j];
                }
            }
    
            //污染动作
            for(int i = 0;i < n;i++){
                for(int j = 0;j <n;j++){
                    if(source[i][j]==1){
                        if(i-1>=0){//上
                            temp[i-1][j]=1;
                        }
                        if(j-1>=0){//左
                            temp[i][j-1]=1;
                        }
                        if(i+1<=n-1){//下
                            temp[i+1][j]=1;
                        }
                        if(j+1<=n-1){//右
                            temp[i][j+1]=1;
                        }
                    }
                }
            }
            return temp;
        }
        
        public static void main(String[] args){
            long startTime=System.currentTimeMillis(); //获取开始时间
            
            //获取输入数据
            Scanner in = new Scanner(System.in);
            String str = in.nextLine();
    
            //如果全为0或者全为1,返回-1
            if(!str.contains("1")||!str.contains("0")){
                System.out.print("-1");
                System.exit(0);
            }
    
            //分割字符串,获取二维数组维度n
            String[] arr = str.split(",");
            int len = arr.length;
            int n = (int) Math.sqrt(len);
    
            //初始化源二维数组source
            int[][] source = new int[n][n];
            for(int i = 0;i < n;i++){
                for(int j = 0;j <n;j++){
                    source[i][j]=Integer.parseInt(arr[i*n+j]);
                }
            }
    
            //定义天数
            int day = 0;
            
            //若检查区域还没有全部被污染,则继续循环
            while(isCheck(source,n)== 0){
                source = black(source,n);
                day++;
            }
            
            //输出结果
            System.out.print(day);
            
            //计算运行时间
            long endTime=System.currentTimeMillis(); //获取结束时间
            System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
  • 相关阅读:
    Ps:变换
    电阻值的优先值
    LCP 18.早餐组合
    【力扣每日一题】2023.9.3 消灭怪物的最大数量
    @EnableAutoConfiguration记录一下
    vscode 无法激活conda虚拟环境
    R语言绘制两种不同形式的投影方法效果图
    低代码是开发的未来吗?浅谈低代码平台
    剖析一下"抢茅台"脚本底层逻辑
    nacos配置管理
  • 原文地址:https://blog.csdn.net/weixin_44505462/article/details/125494603