美文网首页leetCode
【dfs】被围绕的区域

【dfs】被围绕的区域

作者: 修行者12138 | 来源:发表于2020-11-08 19:45 被阅读0次

给定一个二维的矩阵,包含 '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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surrounded-regions

AC代码

/**
 * 上右下左
 */
int[][] direction = new int[][]{{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

/**
 * isNotSurrounded[i][j] = true表示board[i][j]没有被 'X' 围绕,默认为false
 */
boolean[][] isNotSurrounded;

char[][] board;

public void solve(char[][] board) {
    if (board == null || board.length == 0 || board[0].length == 0) {
        return ;
    }

    isNotSurrounded = new boolean[board.length][board[0].length];
    this.board = board;

    for (int j = 0; j < board[0].length; j++) {
        // 第一行
        if (board[0][j] == 'O' && (!isNotSurrounded[0][j])) {
            isNotSurrounded[0][j] = true;
            dfs(0, j);
        }
        // 最后一行
        if (board[board.length - 1][j] == 'O' && (!isNotSurrounded[board.length - 1][j])) {
            isNotSurrounded[board.length - 1][j] = true;
            dfs(board.length - 1, j);
        }
    }

    for (int i = 1; i < board.length - 1; i++) {
        // 第一列
        if (board[i][0] == 'O' && (!isNotSurrounded[i][0])) {
            isNotSurrounded[i][0] = true;
            dfs(i, 0);
        }
        // 最后一列
        if (board[i][board[0].length - 1] == 'O' && (!isNotSurrounded[i][board[0].length - 1])) {
            isNotSurrounded[i][board[0].length - 1] = true;
            dfs(i, board[0].length - 1);
        }
    }

    for (int i = 0; i < board.length; i++) {
        for (int j = 0; j < board[0].length; j++) {
            if (board[i][j] == 'O' && (!isNotSurrounded[i][j])) {
                board[i][j] = 'X';
            }
        }
    }
}

/**
 * 把与board[i][j]相连的'O'标识为没有被 'X' 围绕
 */
private void dfs(int i, int j) {
    for (int k = 0; k < direction.length; k++) {
        int x = i + direction[k][0];
        int y = j + direction[k][1];
        if (check(x, y) && board[x][y] == 'O' && (!isNotSurrounded[x][y])) {
            isNotSurrounded[x][y] = true;
            dfs(x, y);
        }
    }
}

/**
 * 判断board[i][j]是否合法
 */
private boolean check(int i, int j) {
    return  i >= 0 && i < board.length && j >= 0 && j < board[0].length;
}

相关文章

  • DFS——130. 被围绕的区域

    这道题的思路就是从上下和左右分为开始,利用DFS去找边上为O,并且连着的里面也是O的,里面的找到可以标记为Y,这样...

  • 130. 被围绕的区域【BFS】【DFS】

    题目 思路 1、边界处的O肯定没有被包围;2、跟边界处的O连通的O也不能被包围;3、所有不被包围的O,肯定跟某个边...

  • 455,DFS和BFS解被围绕的区域

    给定一个二维的矩阵,包含’X’和’O’(字母 O)。 找到所有被’X’围绕的区域,并将这些区域里所有的’O’用’X...

  • 被围绕的区域

    题目:给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 围绕的区域,并将这些区域里所...

  • LeetCode 130. 被围绕的区域(dfs,bfs,并查集

    这道题有三种解法,可以用dfs或者bfs或者并查集来做使用bfs或者dfs思路:开一个二维布尔数组,记录哪些区域被...

  • LeetCode-130-被围绕的区域

    LeetCode-130-被围绕的区域 130. 被围绕的区域[https://leetcode-cn.com/p...

  • 13 - Hard - 被围绕的区域

    给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 围绕的区域,并将这些区域里所有的 ...

  • 130. 被围绕的区域

    题目描述 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 围绕的区域,并将这些区域...

  • 130. 被围绕的区域

    题目描述 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。找到所有被 'X' 围绕的区域,并将这些区域里...

  • 130. 被围绕的区域

    并查集。。针对这道题。。速度和性能并不高 然后dfs

网友评论

    本文标题:【dfs】被围绕的区域

    本文链接:https://www.haomeiwen.com/subject/cxjrbktx.html