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

牛群的活动区域

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

注意这道题这里的解题思路要从A上转到B中

题目中说的是 请你编写一个程序,找到所有被 'A' 围绕的区域,并将这些区域里所有的 'B' 用 'A' 填充 ,第一反应就是从A出发寻找可以围成一个圈的内容,然后将其中心位置填充。但是这里需要转换一下思路,想想我们不需要改变的那些B的特点:都与边界有联系,所以思路变为:

  1. 从边缘寻找B,然后使用BFS,将和B相连接的所有B都转换为'#'占个位置
  2. 将剩下的B都替换为A
  3. 将 '#' 恢复

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param board char字符型vector<vector<>> 
     * @return char字符型vector<vector<>>
     */
    
    void dfs(vector<vector<char>>&board,int i, int j){
        int m = board.size();
        int n = board[0].size();

        if(i<0 || i>=m || j<0 || j>=n || board[i][j] != 'B'){
            return;
        }
        board[i][j] = '#';

        // 递归进行DFS搜索
        dfs(board,i-1,j);
        dfs(board,i+1,j);
        dfs(board,i,j-1);
        dfs(board,i,j+1);
    }

    vector<vector<char> > solve(vector<vector<char> >& board) {
        // A表示有牛,B表示没
        // 找到A包围的区域,然后将内部的B用A填充
        // 转换为从边界的B开始扩展,标记相连的B为'#'
        // 遍历矩阵将剩余的B变为’A'
        if(board.empty() || board[0].empty()){
            return board;
        }

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

        // 对边界上的B进行DFS搜索,标记与其相连接的所有B
        for(int i=0;i<m;++i){
            // 第一列
            if(board[i][0] == 'B'){
                dfs(board,i,0);
            }
            // 最后一列
            if(board[i][n-1]=='B'){
                dfs(board,i,n-1);
            }
        }
        // 注意这里的第一个已经转换了
        for(int j=1;j<n;++j){
            // 第一行
            if(board[0][j] == 'B'){
                dfs(board,0,j);
            }
            // 最后一行
            if(board[m-1][j]=='B'){
                dfs(board,m-1,j);
            }
        }
        // 遍历矩阵将剩下的B变为A,同时恢复#为B
        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] == '#'){
                    board[i][j] = 'B';
                }
            }
        }
        return board;
    }
};

全部评论

相关推荐

joe2333:怀念以前大家拿华为当保底的日子
点赞 评论 收藏
分享
像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务