华为OD E卷(100分)56-矩阵扩散

 前言

        工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

arnold66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值