题解 | #牛群的活动区域#

牛群的活动区域

https://www.nowcoder.com/practice/eabeca0c6e944a618f8adfed128d847e

考察的知识点:深度优先搜索;

解答方法分析:

  1. 检查输入矩阵是否为空或者数、列数是否为零,如果是,则直接返回原矩阵。
  2. 获取矩阵的行数 m 和列数 n。
  3. 遍历第一行最后一行,对于边界上的 ‘O’,利用深度优先搜索(DFS)将其与边界上的 ‘O’ 相连接的区域置为 ‘B’,表示不被包围的区域。
  4. 遍历一列和最后一列,对于边界上的 ‘O’,同样进行深度优先搜索,将其与边界上的 ‘O’ 相连的区域置为 ‘B’。
  5. 遍历整个矩阵,将剩余的 ‘B’ 替换为 ‘A’,将 ‘O’ 替换为 ‘X’。
  6. 将 ‘B’ 替换为 ‘O’,恢复被包围的 ‘O’ 区域。
  7. 返回更新后的矩阵。

所用编程语言:C++;

完整编程代码:↓

class Solution {
  public:
    vector<vector<char>> solve(vector<vector<char>>& board) {
        if (board.empty() || board[0].empty()) {
            return board;
        }

        int m = board.size();
        int n = board[0].size();

        for (int i = 0; i < m; i++) {
            dfs(board, i, 0);
            dfs(board, i, n - 1);
        }

        for (int j = 1; j < n - 1; j++) {
            dfs(board, 0, j);
            dfs(board, m - 1, j);
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == 'B') {
                    board[i][j] = 'A';
                } else if (board[i][j] == 'C') {
                    board[i][j] = 'B';
                }
            }
        }

        return board;
    }

  private:
    void dfs(vector<vector<char>>& board, int i, int j) {
        if (i < 0 || i >= board.size() || j < 0 || j >= board[0].size() ||
                board[i][j] != 'B') {
            return;
        }

        board[i][j] = 'C';
        dfs(board, i - 1, j);
        dfs(board, i + 1, j);
        dfs(board, i, j - 1);
        dfs(board, i, j + 1);
    }
};

全部评论

相关推荐

07-24 16:39
已编辑
门头沟学院 测试开发
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 17:51
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务