Leetcode 130 被围绕的区域
问题重述
给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。
找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
示例:
X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:
X X X X
X X X X
X X X X
X O X X
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
思路
这一题看着和【417、太平洋大西洋水流问题】样式有点像,我们只需要考虑边界,从最外侧填充,然后考虑里侧。这一题仔细一想,只要不是和最外侧的O相连的,必然是里侧会被X填充,所以我们只需要沿着外围搜索O和与其相连的标记。就可以了。
最终代码
class Solution {
public:
void solve(vector<vector<char>>& board) {
if (board.empty()) {
return;
}
int r = board.size(), c = board[0].size();
for (int i = 0; i < r; ++i) {
dfs(board, i, 0);
dfs(board, i, c - 1);
}
for (int i = 0; i < c; ++i) {
dfs(board, 0, i);
dfs(board, r - 1,i);
}
for (int i = 0; i < r; ++i) {
for (int j = 0; j < c; ++j) {
if (board[i][j] == '1') {
board[i][j] = 'O';
} else {
board[i][j] = 'X';
}
}
}
}
void dfs(vector<vector<char>>& board, int r, int c) {
if (r >= 0 && r < board.size() && c >= 0 && c < board[0].size() && board[r][c]=='O') {
board[r][c] = '1';
dfs(board, r - 1, c);
dfs(board, r + 1, c);
dfs(board, r, c - 1);
dfs(board, r, c + 1);
}
}
};