企业网站每天更新seo外包资讯
给你一个 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'。