每天手撕一道算法题-130. 被围绕的区域

时间:2022-07-23
本文章向大家介绍每天手撕一道算法题-130. 被围绕的区域,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

每天手撕一道算法题-130. 被围绕的区域

130. 被围绕的区域

题目

解析:

根据题目:边界的O不会被填充。只要是与边界的O相连的O,不去改变。其余O都填充为X即可。

从一行最后一行,第一列与最后一列找到边界的O,找到与边界O相连的O,这些O都标记为V。

然后把所有的遍历一遍。标记为O的被抹成X。标记为V的是不能被抹的,改成原来的O。

代码

class Solution {
    public void solve(char[][] a) {
        // 两行或者两列的情况不用考虑,直接返回
        if (a.length < 3 || a[0].length < 3) return;
        // m行n列
        int m = a.length, n = a[0].length;
        // 第1列与最后1列
        for (int i = 0; i < m; i++) {
            dfs(a, i, 0);
            dfs(a, i, n - 1);
        }
        // 第1行与最后1行,跳过重复的
        for (int j = 1; j < n-1; j++) {
            dfs(a, 0, j);
            dfs(a, m - 1, j);
        }
        // 最后将所有的遍历一遍,是O的没被打标记,抹成X。打标记V的改成O。
        for (int i = 0; i < m; i++) 
            for (int j = 0; j < n; j++) {
                if (a[i][j] == 'O') a[i][j] = 'X';
                if (a[i][j] == 'V') a[i][j] = 'O';
            }

    }


    // i行j列
    public void dfs(char[][] a, int i, int j) {
        // 递归结束条件:越界或者不是O,就不再递归下去
        if(i < 0 || i >= a.length || j < 0 || j >= a[0].length || a[i][j] != 'O') return;
        a[i][j] = 'V';
        dfs(a, i-1, j);
        dfs(a, i+1, j);
        dfs(a, i, j-1);
        dfs(a, i, j+1);
    }
}