前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
存在一个m*n的二维数组,其成员取值范围为0或1。其中值为1的成员具备扩散性,每经过1S,将上下左右值为0的成员同化为1。
二维数组的成员初始值都为0,将第[i,j]和[k,l]两个位置上元素修改成1后,求矩阵的所有元素变为1需要多长时间。
输入描述
前两个数是矩阵m*n,中间两个数是第一个点的坐标,最后两个数是第二个点的坐标。其中这两个点初始为1,其他点初始为0。
输出描述
输出矩阵的所有元素变为1所需要秒数。
示例
示例1
输入
4 4 0 0 3 3
输出
3
题解
Java实现
package huawei.e100;
import java.util.Scanner;
/**
* @author arnold
* @date 2025年1月14日
* 矩阵扩散
*/
public class T56 {
// 定义方向
private static final int[][] OFFSET = {{0,1}, {0,-1}, {1,0}, {-1,0}};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int m = sc.nextInt();
int n = sc.nextInt();
int i = sc.nextInt();
int j = sc.nextInt();
int k = sc.nextInt();
int l = sc.nextInt();
int[][] data = new int[m][n];
data[i][j] = 1;
data[k][l] = 1;
int res = run(data, m, n);
System.out.println(res);
}
}
static int run(int[][] data, int m, int n) {
int res = 0;
int count = m*n; // 格子数
int c = 0;
while(c < count-2) { //判断是否填充完成
res++;
boolean[][] isnew = new boolean[m][n]; // 记录是否为本轮新扩散的
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
if(data[i][j] == 1 && isnew[i][j] == false) {
for (int k = 0; k < OFFSET.length; k++) {
if(i+ OFFSET[k][0] < 0 || i+ OFFSET[k][0] >= m || j + OFFSET[k][1] < 0 || j+ OFFSET[k][1] >= n) {
continue;
} else {
if (data[i+OFFSET[k][0]][j+ OFFSET[k][1]] != 1) {
data[i+OFFSET[k][0]][j+ OFFSET[k][1]] = 1;
isnew[i+OFFSET[k][0]][j+ OFFSET[k][1]] = true;
c++;
}
}
}
}
}
}
}
return res;
}
}
标签:OD,int,res,56,nextInt,OFFSET,sc,100,data
From: https://blog.csdn.net/arnold66/article/details/145140433