130. 被围绕的区域(BFS)
给你一个 m x n
的矩阵 board
,由若干字符 'X'
和 'O'
组成,捕获 所有 被围绕的区域:
- 连接:一个单元格与水平或垂直方向上相邻的单元格连接。
- 区域:连接所有
'O'
的单元格来形成一个区域。 - 围绕:如果您可以用
'X'
单元格 连接这个区域,并且区域中没有任何单元格位于board
边缘,则该区域被'X'
单元格围绕。
通过 原地 将输入矩阵中的所有 'O'
替换为 'X'
来 捕获被围绕的区域。你不需要返回任何值。
示例 1:
输入:board = [["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"]]
解释:
在上图中,底部的区域没有被捕获,因为它在 board 的边缘并且不能被围绕。
示例 2:
输入:board = [["X"]]
输出:[["X"]]
提示:
m == board.length
n == board[i].length
1 <= m, n <= 200
board[i][j]
为'X'
或'O'
class Solution {
public:
void solve(vector<vector<char>>& board) {
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
queue<pair<int,int>> q;
int m=board.size();
int n=board[0].size();
for(int i=0;i<m;i++){
if(board[i][0]=='O'){
q.push({i,0});
board[i][0]='1';
}
if(board[i][n-1]=='O'){
q.push({i,n-1});
board[i][n-1]='1';
}
}
for(int i=0;i<n;i++){
if(board[0][i]=='O'){
q.push({0,i});
board[0][i]='1';
}
if(board[m-1][i]=='O'){
q.push({m-1,i});
board[m-1][i]='1';
}
}
while(q.size()){
auto [x,y]=q.front();
q.pop();
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0 && nx<m &&ny>=0 && ny<n && board[nx][ny]=='O'){
board[nx][ny]='1';
q.push({nx,ny});
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]=='O'){
board[i][j]='X';
}
if(board[i][j]=='1'){
board[i][j]='O';
}
}
}
}
};
找到四周上的 'O',入队并标记为 '1'。
最后遍历矩阵,将未标记的 'O' 改为 'X',将 '1' 恢复为 'O'。