LC130 被围绕的区域

LC130 被围绕的区域

题目连接

被围绕的区域

题目思路

DFS

除了和边界上的 'O' 向连的 'O',剩下的 'O' 都是被 'X' 围绕的

所以,本题的思路就是将边界上的 'O' 以及和边界 'O' 相邻的 'O' 先用其他符号('#')代替,剩下的 'O' 就是被 'X' 围绕的,也就是要被替换为 'X' 的。

最后先将 'O' 替换为 'X',再将其他符号('#')用 'O' 替换即可。

题目代码

DFS

class Solution {
    public void solve(char[][] board) {
        int m  = board.length;
        int n = board[0].length;
        
        // 左右边界
        for (int i = 0; i < m; i++) {
            dfs(board, i, 0);
            dfs(board, i, n - 1);
        }

        // 上下边界
        for (int i = 0; i < n; i++) {
            dfs(board, 0, i);
            dfs(board, m - 1, i);
        }

        // 遍历完之后,先将 'O' 变成 'X',再将 '#' 变成 'O',
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == 'O') board[i][j] = 'X';
                if (board[i][j] == '#') board[i][j] = 'O';
            }
        }
    }

    public void dfs(char[][] board, int i, int j) {
        int m = board.length;
        int n = board[0].length;
		
        // 数组越界
        if (i < 0 || i >= m || j < 0 || j >= n) {
            return;
        }
        // 递归到了 'X' 和 '#' 应该返回,换下一个方向
        if (board[i][j] == 'X' || board[i][j] == '#') {
            return;
        }
        // 用 '#' 代替 ’O‘
        board[i][j] = '#';
        // 上
        dfs(board, i - 1, j);
        // 下
        dfs(board, i + 1, j);
        // 左
        dfs(board, i, j - 1);
        // 右
        dfs(board, i, j + 1);
    }
}
posted @ 2024-05-03 19:19  Sstarry  阅读(9)  评论(0)    收藏  举报