分值: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];
}
}
}