您是员工公寓的负责人,为了方便人员管理,现在需要将公寓划片区管理,每个片区安排一名管理员。
假设公寓的分布为矩阵形式,中间会有小花园隔开。“片区”的定义为连续相邻的公寓区,即片区的上下左右都有小花园(对角线的不算相邻)。
公寓矩阵中 1 表示公寓,0 表示小花园,请您统计出整个公寓区有多少个“片区”。
例子:
mat[M][N] = [
[0,0,0],
[1,1,0],
[1,1,0],
[0,0,1],
[0,0,1],
[1,1,0]
];
输出:3
mat[M][N] = [
[1,0,0,0,0,0],
[1,0,1,1,1,1],
[0,0,0,0,0,0],
[1,1,1,0,1,1],
[1,1,1,0,1,1],
[0,0,0,0,1,1]
];
输出:4
import java.util.Scanner;
public class ApartmentManager {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取一行输入,假设所有输入都在这一行
String line = scanner.nextLine();
// 分割输入为三部分:矩阵字符串、行数、列数
int l = line.length();
String matrixStr = line.substring(0, l - 4); // 矩阵字符串
int cols = Integer.parseInt(line.substring(l - 1)); // 列数
int rows = Integer.parseInt(line.substring(l - 3, l - 2)); // 行数
System.out.println(countAreas(matrixStr, rows, cols));
}
public static int countAreas(String input, int rows, int cols) {
int[][] mat = parseInput(input, rows , cols );
if (mat == null || mat.length == 0 || mat[0].length == 0) return 0;
int areaCount = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (mat[i][j] == 1) {
dfs(mat, i, j);
areaCount++;
}
}
}
return areaCount;
}
private static void dfs(int[][] mat, int i, int j) {
if (i < 0 || i >= mat.length || j < 0 || j >= mat[0].length || mat[i][j] != 1) {
return;
}
mat[i][j] = 2; // 标记为已访问
dfs(mat, i - 1, j); // 上
dfs(mat, i + 1, j); // 下
dfs(mat, i, j - 1); // 左
dfs(mat, i, j + 1); // 右
//把这些方向的数组都标记成2
}
private static int[][] parseInput(String input, int rows, int cols) {
// 去掉外层的中括号
input = input.substring(2, input.length() - 2);
// 将字符串转换为二维数组
String[] elements = input.split("\\],\\["); // 按照逗号和中括号分割
int[][] mat = new int[rows][cols];
for (int i = 0; i < elements.length; i++) {
String[] nums = elements[i].split(",");
for (int j = 0; j < nums.length; j++) {
mat[i][j] = Integer.parseInt(nums[j]);
}
}
return mat;
}
}