LeetCode-130.被围绕的区域(相关话题:深度优先)

给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。

找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

示例:

X X X X
X O O X
X X O X
X O X X

运行你的函数后,矩阵变为:

X X X X
X X X X
X X X X
X O X X

解释:

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

思路:深度优先遍历四条边上的‘O‘,将其置为‘P’(即不需要修改为‘X’的‘O’元素),然后遍历矩阵,将‘O’置为‘X’,‘P’置为‘O’

Java代码:

public void solve(char[][] board) {
    int m = board.length;
    if (0 != m) {
        int n = board[0].length;

        // 深度遍历四条边上的'O',置为'P',即不需要修改为'X'的元素
        for (int j = 0; j < n; j++) {
            if ('O' == board[0][j])
                dfs(0, j, m, n , board);

            if ('O' == board[m-1][j])
                dfs(m-1, j, m, n, board);
        }
        for (int i = 0; i < m; i++) {
            if ('O' == board[i][0])
                dfs(i, 0, m, n, board);

            if ('O' == board[i][n-1])
                dfs(i, n-1, m, n, board);
        }

        for (int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if('X' == board[i][j])
                    continue;

                board[i][j] = 'P' == board[i][j] ? 'O' : 'X';
            }
        }
    }
}
private void dfs(int line, int col, int m, int n, char[][] board) {
    board[line][col] = 'P';
    if (line > 0 && 'O' == board[line-1][col])
        dfs(line-1, col, m, n, board);
    if (line < m-1 && 'O' == board[line+1][col])
        dfs(line+1, col, m, n, board);
    if (col > 0 && 'O' == board[line][col-1])
        dfs(line, col-1, m, n, board);
    if (col < n-1 && 'O' == board[line][col+1])
        dfs(line, col+1, m, n, board);
}

猜你喜欢

转载自blog.csdn.net/weixin_38823568/article/details/85211154