2023华为OD机试 (B卷)|200分 疫情扩散时间计算(Java JavaScript C++ Python)
题目描述
- 在一个地图中(地图有
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 <=N <= 200
用例
输入 | 1,0,1,0,0,0,1,0,1 |
---|---|
输出 | 2 |
说明 | 一天以后,地图中仅剩余中心点未被感染,2天后,全部被感染 |
输入 | 1,1,1,1,1,1,1,1,1 |
输出 | -1 |
说明 | 全部被感染 |
Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
List<Integer> map = new ArrayList<>();
int pos = 0;
String token;
while ((pos = input.indexOf(",")) != -1) {
// 将输入字符串转换为一维数组
token = input.substring(0, pos);
map.add(Integer.parseInt(token));
input = input.substring(pos + 1);
}
map.add(Integer.parseInt(input));
System.out.println(getResult(map)); // 输出感染天数
}
public static int getResult(List<Integer> map) {
int n = (int) Math.sqrt(map.size());
int[][] matrix = new int[n][n]; // 将一维数组转换为二维矩阵
Queue<int[]> q = new LinkedList<>(); // 用队列存储感染区域
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++