zoukankan      html  css  js  c++  java
  • LeetCode 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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

    解题思路

    分为两步:

    • 首先对矩阵四条边界上的所有'O'进行深度优先搜索,并将所有与边界相连区域的'O'填充为'#'
    • 然后遍历整个矩阵,将当前所有'O',即处在'X' 围绕的区域的'O'填充为'X',并将上一步填充的所有'#'还原为'O'

    代码

     1 class Solution {
     2 public:
     3     void solve(vector<vector<char>>& board) {
     4         if(board.empty() || board[0].empty()) return;
     5         int rows = board.size(), cols = board[0].size();
     6         for(int i = 0; i < cols; i++){
     7             if(board[0][i] == 'O') fillBorder(board, 0, i);
     8             if(board[rows - 1][i] == 'O') fillBorder(board, rows - 1, i);
     9         }
    10         for(int i = 0; i < rows; i++){
    11             if(board[i][0] == 'O') fillBorder(board, i, 0);
    12             if(board[i][cols - 1] == 'O') fillBorder(board, i, cols - 1);
    13         }
    14         for(int i = 0; i < rows; i++){
    15             for(int j = 0; j < cols; j++){
    16                 if(board[i][j] == 'O') board[i][j] = 'X';
    17                 if(board[i][j] == '#') board[i][j] = 'O';
    18             }
    19         }
    20     }
    21     void fillBorder(vector<vector<char>>& board, int row, int col){
    22         board[row][col] = '#';
    23         if(row - 1 >= 0 && board[row - 1][col] == 'O') fillBorder(board, row - 1, col);
    24         if(row + 1 < board.size() && board[row + 1][col] == 'O') fillBorder(board, row + 1, col);
    25         if(col - 1 >= 0 && board[row][col - 1] == 'O') fillBorder(board, row, col - 1);
    26         if(col + 1 < board[0].size() && board[row][col + 1] == 'O') fillBorder(board, row, col + 1);
    27     }
    28 };
  • 相关阅读:
    SAP和ABAP内存的区别
    ABAP如何限制自己开发的耗时报表在sap系统中运行的个数,以保证正常业务的进行
    ABAP如何创建动态结构的报表
    FISAP财务成本知识库
    ABAPSAP显示处理进度的函数
    ABAP如何在REUSE_ALV_GRID_DISPLAY标识不同行用不同的颜色
    Java: 获取当前执行位置的文件名/类名/方法名/行号
    查询不重复的列
    [转载]用SQL语句添加删除修改字段
    [转载]查询之order by,group by和having的使用(一)
  • 原文地址:https://www.cnblogs.com/wmx24/p/9455280.html
Copyright © 2011-2022 走看看