题目描述
存在一个m*n的二维数组,其成员取值范围为0、1、2。其中:
- 值为1的元素具备同化特性,每经过1秒,会将其上下左右相邻的值为0的元素同化为1;
- 值为2的元素免疫同化,不会被改变;
- 初始时,矩阵所有成员随机初始化为0或2,且需将矩阵的[0,0]位置强制修改为1;
- 经过足够长时间后,求矩阵中剩余的非1元素(即0和2)的总数量。
输入描述
前两个数字为矩阵大小m和n,后续为矩阵内容,每行数据用空格分隔。
输出描述
返回非1的元素个数。
示例输入
4 4
0 0 0 0
0 2 2 2
0 2 0 0
0 2 0 0
输出
9
示例输入
3 3
0 2 0
2 2 0
0 0 0输出:8
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt(); // 读取矩阵行数
int n = in.nextInt(); // 读取矩阵列数
int[][] nums = new int[m][n]; // 创建二维数组
// 读取矩阵数据
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
nums[i][j] = in.nextInt();
}
}
// 将起点(0,0)标记为已访问(值设为1)
nums[0][0] = 1;
// 从起点开始向两个方向进行深度优先搜索
// 向右搜索
dfs(nums, m, n, 1, 0);
// 向下搜索
dfs(nums, m, n, 0, 1);
// 统计矩阵中剩余的0的数量(即无法从起点到达的0)
int res = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (nums[i][j] != 1) { // 如果不是1,说明无法到达
res++;
}
}
}
// 输出结果
System.out.println(res);
}
// 深度优先搜索函数
public static void dfs(int[][] nums, int m, int n, int x, int y) {
// 边界检查:越界或者当前位置不是0(已访问或者是障碍)
if (x < 0 || x >= m || y < 0 || y >= n || nums[x][y] != 0) {
return;
}
// 标记当前位置为已访问(值设为1)
nums[x][y] = 1;
// 向四个方向继续搜索
// 向下
dfs(nums, m, n, x + 1, y);
// 向上
dfs(nums, m, n, x - 1, y);
// 向右
dfs(nums, m, n, x, y + 1);
// 向左
dfs(nums, m, n, x, y - 1);
}
}
738

被折叠的 条评论
为什么被折叠?



