题目
存在一个m * n的二维数组,其成员取值范围为0,1,2。其中值为1的元素具备同化特性,每经过1S,将上下左右值为0的元素同化为1。而值为2的元素,免疫同化。将数组所有成员随机初始化为0或2,再将矩阵的[0,0]元素修改成1,在经过足够长的时间后求矩阵中有多少个元素是0或2(即0和2数量之和)
输入描述
输入的前两个数字是矩阵大小。后面是数字矩阵内容
输出描述返回矩阵中非1的元素个数
示例1:
输入4 4
0 0 0 0
0 2 2 2
0 2 0 0
0 2 0 0
输出9
说明输入数字前两个数字是矩阵大小。后面的数字是矩阵内容。起始位置(0,0)被修改为1后,最终只能同化矩阵为:
1 1 1 1
1 2 2 2
1 2 0 0
1 2 0 0
所以矩阵中非1的元素个数为:
9
思路
题解
java
package hwod;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class MatrixNotOne {
private static int[] x_axis = {0, 1, 0, -1};
private static int[] y_axis = {1, 0, -1, 0};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
sc.nextLine();
int[][] nums = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
nums[i][j] = sc.nextInt();
}
}
System.out.println(matrixNotOne(nums));
}
private static int matrixNotOne(int[][] nums) {
int m = nums.length, n = nums[0].length;
Queue<Integer> queue = new LinkedList<>();
nums[0][0] = 1;
queue.add(0);
while (!queue.isEmpty()) {
int cur = queue.remove();
int x = cur / n, y = cur % n;
for (int i = 0; i < 4; i++) {
int new_x = x + x_axis[i];
int new_y = y + y_axis[i];
if (new_x >= 0 && new_x < m && new_y >= 0 && new_y < n && nums[new_x][new_y] == 0) {
nums[new_x][new_y] = 1;
queue.add(new_x * n + new_y);
}
}
}
int res = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if(nums[i][j]!=1) res++;
}
}
return res;
}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。