图:Flood Fill

2022-05-16 每日一题 LeetCode

# 0130. 被围绕的区域 (opens new window)

题目

给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

解析

从四周向中间 DFS,将所有与最外层 O 相连通的区域标记,最后将剩余的 O 更改为 X。

代码

class Solution {
    int m, n;
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, -1, 0, 1};
public:
    void solve(vector<vector<char>>& board) {
        m = board.size(), n = board[0].size();
        for (int i = 0; i < m; i++) {
            if (board[i][0] == 'O') dfs(board, i, 0);
            if (board[i][n - 1] == 'O') dfs(board, i, n - 1);
        }
        for (int j = 0; j < n; j++) {
            if (board[0][j] == 'O') dfs(board, 0, j);
            if (board[m - 1][j] == 'O') dfs(board, m - 1, j);
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == '#') board[i][j] = 'O';
                else board[i][j] = 'X';
            }
        }
    }

    void dfs(vector<vector<char>>& board, int x, int y) {
        board[x][y] = '#';
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i], ny = y + dy[i];
            if (nx >= 0 && nx < m && ny >= 0 && ny < n && board[nx][ny] == 'O') {
                dfs(board, nx, ny);
            }
        }
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 0200. 岛屿数量 (opens new window)

题目

解析

代码

# 0286. 墙与门 (opens new window)

题目

解析

代码

# 0317. 离建筑物最近的距离 (opens new window)

题目

解析

代码

# 0329. 矩阵中的最长递增路径 (opens new window)

题目

解析

代码

# 0407. 接雨水 II (opens new window)

题目

解析

代码

# 0417. 太平洋大西洋水流问题 (opens new window)

题目

解析

代码

# 0489. 扫地机器人 (opens new window)

题目

解析

代码

# 0490. 迷宫 (opens new window)

题目

解析

代码

# 0499. 迷宫 III (opens new window)

题目

解析

代码

# 0505. 迷宫 II (opens new window)

题目

解析

代码

# 0529. 扫雷游戏 (opens new window)

题目

解析

代码

# 0542. 01 矩阵 (opens new window)

题目

解析

代码

# 0576. 出界的路径数 (opens new window)

题目

解析

代码

Last Updated: 2023-01-28 4:31:25