算法

火星改造

2025-11-25  本文已影响0人  何以解君愁

 2XXX 年,人类通过对火星的大气进行宜居改造分析,使得火星已在理论上具备人类宜居的条件;
 由于技术原因,无法一次性将火星大气全部改造,只能通过局部处理形式;
 假设将火星待改造的区域为 row * column 的网格,每个网格有 3 个值,宜居区、可改造区、死亡区,使用 YES、NO、NA 代替:

 YES 表示该网格已经完成大气改造;
 NO 表示该网格未进行改造,后期可进行改造;
 NA 表示死亡区,不作为判断是否改造完成的宜居,无法穿过;
 初始化下,该区域可能存在多个宜居区,并且每个宜居区能同时在每个太阳日单位向上下左右四个方向的相邻格子进行扩散,自动将 4 个方向相邻的真空区改造成宜居区;
 请计算这个待改造区域的网格中,可改造区是否能全部变成宜居区,如果可以,则返回改造的太阳日天数,不可以则返回-1。
 输入描述
  输入 row * column 个网格数据,每个网格值枚举值如下:YES,NO,NA;
  样例:

       YES YES NO
       NO NO NO
       NA NO YES

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

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        List<String> temp = new ArrayList<>();
        while(sc.hasNextLine()){
            String s = sc.nextLine().trim();
            if(s.isEmpty()){
                break;
            }
            temp.add(s);
        }
        //接收参数
        String[] lengthGet = temp.get(0).split("[ ]");
        String[][] check = new String[temp.size()][lengthGet.length];
        for(int i = 0;i < temp.size();i++){
            String[] tempValue = temp.get(i).split("[ ]");
            for(int j = 0;j < tempValue.length;j++){
                check[i][j] = tempValue[j];
            }
        }
        //行列简写
        int m = check.length;
        int n = check[0].length;
        //计算待改造数
        int noCheck = 0;
        //队列存放YES坐标
        Deque<Integer> yesCheck = new ArrayDeque<>();
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(check[i][j].equals("YES")){
                    //存放坐标
                    yesCheck.offer(i * n + j);
                }else if(check[i][j].equals("NO")){
                    noCheck++;
                }
            }
        }
        
        if(noCheck == 0){
            //开始就改造完了
            System.out.print("0");
        }else{
            int time = 0;
            //存在没有改造完的
            while(noCheck > 0&&!yesCheck.isEmpty()){
                time++;
                //多个yes一起执行
                int length = yesCheck.size();
                for(int i = 0;i < length;i++){
                    int index = yesCheck.poll();
                    //得到行列
                    int col = index / n;
                    int row = index % n;
                    //处理上下左右
                    if(col - 1 > -1&&check[col - 1][row].equals("NO")){
                        noCheck--;
                        check[col - 1][row] = "YES";
                        yesCheck.offer((col - 1) * n + row);
                    }
                    if(col + 1 < m&&check[col + 1][row].equals("NO")){
                        noCheck--;
                        check[col + 1][row] = "YES";
                        yesCheck.offer((col + 1) * n + row);
                    }
                    if(row - 1 > -1&&check[col][row - 1].equals("NO")){
                        noCheck--;
                        check[col][row - 1] = "YES";
                        yesCheck.offer(col * n + row - 1);
                    }
                    if(row + 1 < n&&check[col][row + 1].equals("NO")){
                        noCheck--;
                        check[col][row + 1] = "YES";
                        yesCheck.offer(col * n + row + 1);
                    }
                }
            }
            //返回改造完或未改造完的结果
            System.out.println(noCheck == 0 ? time : -1);
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读