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.lengthn == board[i].length1 <= m, n <= 200board[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'。
