Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)

Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)

深度优先搜索的解题详细介绍,点击


 

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


 

 

分析:

题中给出一个地图,让你把被X框住的O的连通体全部变成X。

有几个需要注意的点:

1、当出现一下这种情况的时候,图不改变:

        /*
         * XXXX
         * XOOX
         * XXOX
         * XOOX
         */

不改变的原因是,最后一行有O,所以让所有的O不被X包围了。

 

2、根据1所分析的,我们引入一个vis数组来记录是否被访问,然后我们只需要找出 第一行最后一行第一列最后一列里面出现的O,然后进入DFS,找出这些O的连通块就好了,把这些O的vis都设置为1。

然后DFS全部结束后,遍历board数组,把vis[i][j]==0(没被访问过,即与边界不连通)的且board[i][j]=='O'的全部变为'X'就好了。

 

AC代码:

class Solution {
    int dirx[] = {0,0,1,-1};
    int diry[] = {1,-1,0,0};
    public void solve(char[][] board) {
        if(board.length==0 || board==null) return;
        
        int[][] vis = new int[board.length][board[0].length];
        
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[0].length;j++){
                boolean isEdge = i==0||j==0||i==board.length-1||j==board[0].length-1;
                if(isEdge && board[i][j]=='O'){
                    dfs(board,vis,i,j);
                }
            }
        }
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[0].length;j++){
                if(board[i][j]=='O' && vis[i][j]==0){
                    board[i][j] = 'X';
                }
            }
        }

    }
    public void dfs(char[][] board, int[][] vis, int i, int j) {
        if(i<0 || j<0 || i>=board.length || j>=board[0].length || board[i][j]=='X' ||vis[i][j]==1){
            return;
        }
        vis[i][j] = 1;
        for(int a=0;a<4;a++){
            int xx = i + dirx[a];
            int yy = j + diry[a];
            dfs(board,vis,xx,yy);
        }
    }
}

 

posted @ 2019-08-11 01:22  秦羽纶  阅读(327)  评论(0编辑  收藏  举报