美团 :深度优先遍历

您是员工公寓的负责人,为了方便人员管理,现在需要将公寓划片区管理,每个片区安排一名管理员。
假设公寓的分布为矩阵形式,中间会有小花园隔开。“片区”的定义为连续相邻的公寓区,即片区的上下左右都有小花园(对角线的不算相邻)。
公寓矩阵中 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值