题解 | #牛群的活动区域#
牛群的活动区域
https://www.nowcoder.com/practice/eabeca0c6e944a618f8adfed128d847e
注意这道题这里的解题思路要从A上转到B中
题目中说的是 请你编写一个程序,找到所有被 'A' 围绕的区域,并将这些区域里所有的 'B' 用 'A' 填充 ,第一反应就是从A出发寻找可以围成一个圈的内容,然后将其中心位置填充。但是这里需要转换一下思路,想想我们不需要改变的那些B的特点:都与边界有联系,所以思路变为:
- 从边缘寻找B,然后使用BFS,将和B相连接的所有B都转换为'#'占个位置
- 将剩下的B都替换为A
- 将 '#' 恢复
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;
}
};
查看12道真题和解析
