题目
题目描述
存在一个 m × n的二维数组,其成员取值范围为 0 或 1,其中值为 1 的成员具备扩散性,每经过 1S,将上下左右值为 0 的成员同化为 1,二维数组的成员初始值都为 0,将第 [i, j] 和 [k, l] 两个个位置上元素修改成 1 后,求矩阵的所有元素变为 1 需要多长时间。
输入描述
输入数据中的前 2 个数字表示这是一个 m × n 的矩阵,m 和 n 不会超过 1024 大小;
中间 2 个数字表示一个初始扩散点位置为 i, j
最后 2 个数字表示另一个扩散点位置为 k, l
输出描述
输出矩阵的所有元素变为 1 所需要秒数。
示例
输入:
4,4,0,0,3,3
输出:
3
说明:
输入数据中的前2个数字表示这是一个4×4的矩阵;
中间两个数字表示一个初始扩散点位置为0,0;
最后2个数字表示另一个扩散点位置为3,3;
给出的样例是一个简单模型,初始点在对角线上,达到中间的位置分别是3次迭代,即3秒。所以输出位3。
解题思路
典型的多源 BFS、时间扩散问题。
2 个源已经定义好了,初始化一个 grid,默认全是 0,把 2 个网格置为1。
把 2 个源放到 queue 中,进行 BFS 扩散,统计层数,层数即扩散时间。
代码
public class MatrixDiffusion {
public int solution(int m, int n, int[] point1, int[] point2) {
int[][] grid = new int[m][n];
grid[point1[0]][point1[1]] = 1;
grid[point2[0]][point2[1]] = 1;
Queue<int[]> queue = new LinkedList<>();
queue.offer(point1);
queue.offer(point2);
int step = 0;
int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
int[] cur = queue.poll();
for (int[] dir : dirs) {
int nx = cur[0] + dir[0], ny = cur[1] + dir[1];
if (nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] == 0) {
grid[nx][ny] = 1;
queue.offer(new int[] {nx, ny});
}
}
}
step++;
}
return step - 1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
String[] numbers = line.split(",");
int m = Integer.parseInt(numbers[0]);
int n = Integer.parseInt(numbers[1]);
int[] point1 = new int[] {Integer.parseInt(numbers[2]), Integer.parseInt(numbers[3])};
int[] point2 = new int[] {Integer.parseInt(numbers[4]), Integer.parseInt(numbers[5])};
// 算法
MatrixDiffusion matrixDiffusion = new MatrixDiffusion();
System.out.println(matrixDiffusion.solution(m, n, point1, point2));
}
}
评论