LeetCode 被围绕的区域

题目描述:

给定一个二维的矩阵,包含 '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

解题思路:DFS+遍历实现,先使用DFS将数组边界上的 'O'转换成 'Y'

  然后在循环遍历整个二维数组,将数组中的所有‘O’转换成'X',将'Y'转换为'O'

java实现:

class Solution {
    public void solve(char[][] board) {
        if(board.length == 0 || board[0].length==0){
            return;
        }
        int row = board.length;
        int col = board[0].length;
        for(int i=0;i<row;i++){
                dfsSearch(board,i,0); // 左边界
                dfsSearch(board,i,col-1);  // 右边界
        }
        for(int j=0;j<col;j++){
                dfsSearch(board,0,j);   // 上边界
                dfsSearch(board,row-1,j); // 下边界
        }
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(board[i][j] == 'O'){
                    board[i][j] = 'X';
                } else if(board[i][j] == 'Y'){
                    board[i][j] = 'O';
                }
            }
        }
    }
// 这里DFS要注意,越界情况
    public void dfsSearch(char[][] board, int row,int col){
        if(board[row][col] == 'O'){
            board[row][col] = 'Y';
            if(row > 1){
                dfsSearch(board,row-1,col);
            }
            if(col > 1){
                dfsSearch(board,row,col-1);
            }
            if(row < board.length - 1){
                dfsSearch(board,row+1,col);
            }
            if(col < board[0].length - 1){
                 dfsSearch(board,row,col+1);
            }
        }  
    }
}
原文地址:https://www.cnblogs.com/lc1475373861/p/12093533.html