题解 | #牛群的活动区域#
牛群的活动区域
https://www.nowcoder.com/practice/eabeca0c6e944a618f8adfed128d847e
考察的知识点:深度优先搜索;
解答方法分析:
- 检查输入矩阵是否为空或者数、列数是否为零,如果是,则直接返回原矩阵。
- 获取矩阵的行数 m 和列数 n。
- 遍历第一行最后一行,对于边界上的 ‘O’,利用深度优先搜索(DFS)将其与边界上的 ‘O’ 相连接的区域置为 ‘B’,表示不被包围的区域。
- 遍历一列和最后一列,对于边界上的 ‘O’,同样进行深度优先搜索,将其与边界上的 ‘O’ 相连的区域置为 ‘B’。
- 遍历整个矩阵,将剩余的 ‘B’ 替换为 ‘A’,将 ‘O’ 替换为 ‘X’。
- 将 ‘B’ 替换为 ‘O’,恢复被包围的 ‘O’ 区域。
- 返回更新后的矩阵。
所用编程语言: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);
}
};
老板电器公司氛围 216人发布
