描述
在一个牧场中,有很多牛。为了方便管理,牧场主将牛的编号排列成一个 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);
}
}