题解 | #牛群的活动区域#

104 阅读1分钟

描述

在一个牧场中,有很多牛。为了方便管理,牧场主将牛的编号排列成一个 m x n 的矩阵。矩阵中的每个元素表示一个牛的位置,'A' 表示有牛,'B' 表示没有牛。请你编写一个程序,找到所有被 'A' 围绕的区域,并将这些区域里所有的 'B' 用 'A' 填充。

被围绕的区间不会存在于边界上,换句话说,任何边界上的 'B' 都不会被填充为 'A'。任何不在边界上,或不与边界上的 'B' 相连的 'B' 最终都会被填充为 'A'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

示例1

输入: [[A,A,A,A],[A,B,B,A],[A,A,B,A],[A,B,A,A]]
返回值: [[A,A,A,A],[A,A,A,A],[A,A,A,A],[A,B,A,A]]

备注:

1 <= m, n <= 200

知识点

递归,dfs

解题思路

使用深度优先搜索 (DFS) 来查找与边界上的 ‘B’ 相连的所有 ‘B’。将边界上的 ‘B’ 标记为特殊字符 ‘#’。然后,遍历整个矩阵,将剩余的 ‘B’ 修改为 ‘A’,将特殊字符 ‘#’ 恢复为 ‘B’。最后返回修改后的矩阵。

Java题解

import java.util.*;
public class Solution {
// 使用深度优先搜索 (DFS) 标记与指定位置相连的 'B' 为特殊字符 '#'
    private void dfs(char[][] board, int x, int y) {
        int m = board.length;
        int n = board[0].length;

        if (x < 0 || x >= m || y < 0 || y >= n || board[x][y] != 'B') {
            return;
        }

        board[x][y] = '#';

        dfs(board, x - 1, y);
        dfs(board, x + 1, y);
        dfs(board, x, y - 1);
        dfs(board, x, y + 1);
    }
}