【力扣】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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

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

class Solution {
    int x,y; // x为横轴 y为纵轴
    public void solve(char[][] board) {
       //1.首先,把所有的边界上的O以及同边界相连接的O赋值为一个随便的数 A
        //问题来了,怎么循环这个数组的边界
        x = board.length;
        if(x == 0){
            return;
        }
        y = board[0].length;

        //1.1完成上边界、下边界的遍历
        for(int i =0 ; i< x; i++){
            if(board[i][0] == 'O'){
                dfs(board,i,0); // 数组的第一行
            }
            if(board[i][y-1] == 'O'){
                dfs(board,i,y-1); // 数组的最后一行
            }
        }

        //1.2完成左边界、右边界的遍历
        for(int i =0 ; i< y; i++){
            if(board[0][i] == 'O'){
                dfs(board,0,i); // 数组的第一列
            }
            if(board[x-1][i] == 'O'){
                dfs(board,x-1,i); // 数组的最后一列
            }
        }

       //2.根据第一步的结果,遍历这个数组,得到哪些O需要被覆盖
       for(int i =0 ; i< x; i++){
           for(int j =0;j < y; j++){
               if(board[i][j] == 'A'){
                   board[i][j]='O'; //还原
               } else if(board[i][j] == 'O'){
                   board[i][j]='X'; //将包含的内容改为X
               }
           }
       }
       
    }

    /**
    * 方法:
    * 入参为数组、横轴、纵轴
    * 结果:
    * 把相邻的O都改成A
    **/
    public void dfs(char[][] board, int horizontal,int vertical){

        //如果说横轴和纵轴已经小于0,大于最大值,就不能再递归了
        //或者是值为X 不能再递归了
        if(horizontal<0 || vertical < 0 || horizontal >= x ||  vertical >= y  || board[horizontal][vertical] == 'X' || board[horizontal][vertical] == 'A'  ){
            return;
        }
        board[horizontal][vertical] = 'A';
        dfs(board,horizontal+1,vertical); //从上边界往下找,是否有O的
        dfs(board,horizontal-1,vertical);//从下边界往上找,是否有O的

        dfs(board,horizontal,vertical+1); //从左边界往右找,是否有O的
        dfs(board,horizontal,vertical-1);//从右边界往左找,是否有O的

    }
}
一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻
原文地址:https://www.cnblogs.com/fengtingxin/p/13485495.html