zoukankan      html  css  js  c++  java
  • 【力扣】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开发,越学习越感觉知识太多,自身了解太少,只能不断追寻
  • 相关阅读:
    关于研发岗位怎样做新人培训
    打工人的出路
    箭头函数的副作用
    前端日志系统设计
    cocos creator3d开发插件
    linux+Docker+asp.netCore部署
    asp.net core API 3.1获取图片返回流文件
    asp.net Core API 获取ip地址
    asp.net core 3.1配置log4net
    Asp.net Core JsonWebToken记录
  • 原文地址:https://www.cnblogs.com/fengtingxin/p/13485495.html
Copyright © 2011-2022 走看看