zoukankan      html  css  js  c++  java
  • 被围绕的区域

    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

    深度优先解法

    二维的内容基本确定为各种遍历,因为类似于图。这里比较好选择,一般采用深度优先算法解答。关键在于题目说明了,在任何边界上的‘O'都不会被填充为'X'。所以逆推一个思路,如果此时分别从四边开始遍历直接或者间接与此四条边上的'O'相连通的'O',并做下标记。

    然后重新开始二循环遍历这个矩阵,将之前做下的标记更换为“O”,而没有做下的标记就将其更换为'X',这样子可以完成解答了。

    还是要注意边界。

    Demo

    class Solution {
        int n, m;
    
        public void solve(char[][] board) {
            // n是x的宽度
            n = board.length;
            if (n == 0) {
                return;
            }
            // m是y的宽度
            m = board[0].length;
            for (int i = 0; i < n; i++) {
                dfs(board, i, 0);
                dfs(board, i, m - 1);
            }
            for (int i = 1; i < m - 1; i++) {
                dfs(board, 0, i);
                dfs(board, n - 1, i);
            }
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (board[i][j] == 'A') {
                        board[i][j] = 'O';
                    } else if (board[i][j] == 'O') {
                        board[i][j] = 'X';
                    }
                }
            }
        }
    
        public void dfs(char[][] board, int x, int y) {
            if (x < 0 || x >= n || y < 0 || y >= m || board[x][y] != 'O') { //终止条件
                return;
            }
            board[x][y] = 'A';
            dfs(board, x + 1, y);
            dfs(board, x - 1, y);
            dfs(board, x, y + 1);
            dfs(board, x, y - 1);
        }
    }
    
  • 相关阅读:
    HDU4507 吉哥系列故事――恨7不成妻(数位dp)
    UCF Local Programming Contest 2017 G题(dp)
    ICPC Latin American Regional Contests 2019 I题
    UCF Local Programming Contest 2017 H题(区间dp)
    HDU2089 不要62
    AcWing1084 数字游戏II(数位dp)
    UCF Local Programming Contest 2017 F题(最短路)
    Google Code Jam 2019 Round 1A Pylons(爆搜+贪心)
    AcWing1083 Windy数(数位dp)
    Vue
  • 原文地址:https://www.cnblogs.com/Di-iD/p/13784615.html
Copyright © 2011-2022 走看看