【华为OD机试真题】【2024年E卷】数值同化-队列&BFS(Java)

分值:200
题目描述
存在一个 m * n 的 二维数组只,其成员取值范围为0, 1, 2。其中值为1的元素具备同化特性,每经过1S,将上下左右值为0的元素同化为1。而值为2的元素,免疫同化。
将数组所有成员随机初始化只为0或2,再将矩阵的[0,0]元素修改成1,在经过足够长的时间后,求矩阵中有多少个元素是0或2(即0和2数量之和)。
输入描述:
输入的前两个数字是矩阵大小n 和m。
接着输入n行m列,表示矩阵信息。
输出描述:
返回矩阵中非 1的元素个数。

示例1
输入:
4 4
0 0 0 0
0 2 0 0
0 0 2 0
0 0 0 2
输出:
3
解释:
除了矩阵中 3 个值为2的元素,其他元素全部同化为1了。

示例2
输入:
4 4
0 2 0 0
0 2 0 0
0 2 0 0
0 2 0 0
输出:
12
解释:
只有第一列被同化为1了,第2、3、4列没有被同化,因为第二列全是值为2的元素,阻挡住同化了。

 注:作为新手,并未使用队列&BFS,代码自己硬磕出来,相对于使用队列&BFS效果差非常多,继续加油吧,本文只是作为一个记录!

java

package odTest;

import java.util.Arrays;
import java.util.Scanner;

public class assimilate {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			String[] inputLine1 = scanner.nextLine().split(" ");
			int[] latitude = Arrays.stream(inputLine1).mapToInt(Integer::parseInt).toArray();
			int[][] matrix =new int[latitude[0]][latitude[1]];
//			初始化矩阵
			for(int i=0;i<latitude[0];i++) {
				String[] inputLine = scanner.nextLine().split(" ");
				int[] lineData = Arrays.stream(inputLine).mapToInt(Integer::parseInt).toArray();
				originMatrix(matrix,lineData,i);
			}
			//将[0][0]元素修改为1
			matrix[0][0]=1;
			//开始同化
			activationMatrix(matrix,latitude,0,0);
			int num = 0;
			for(int i =0;i<latitude[0];i++) {
				for(int j =0;j<latitude[1];j++) {
					if(matrix[i][j] != 1)
					num++;
				}
			}
			System.out.println(num);
		}
	}

	//同化
	private static void activationMatrix(int[][] matrix, int[] latitude, int R,int L) {
		boolean[][] hasJudge = new boolean[latitude[0]][latitude[1]];
        for(int i =0;i<latitude[0];i++) {
        	for(int j=0;j<latitude[1];j++) {
        		if(matrix[i][j]==2||matrix[i][j]==1) {
        			continue;
        		}
        		assimilateWay(matrix,latitude,i,j);
        	}
        }
		
	}
	
	public static void assimilateWay(int[][] matrix, int[] latitude, int R, int L) {
		if((R>0&&matrix[R-1][L]==1)||(L>0&&matrix[R][L-1]==1)||
				(R>0&&R<latitude[0]&&matrix[R-1][L]==1)||
				(L>0&&L<latitude[1]&&matrix[R][L-1]==1)){
			//符合条件直接为1
	        matrix[R][L] = 1;
		}
	}
	
	//初始化矩阵
	public static void originMatrix(int[][] matrix, int[] lineData,int R) {
		for(int i =0;i<lineData.length;i++) {
        		matrix[R][i]=lineData[i];
        }
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值