链接
题目
给你一个
m x n
的矩阵board
,由若干字符'X'
和'O'
,找到所有被'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"]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。示例 2:输入:board = [["X"]] 输出:[["X"]]
说明
m == board.length
n == board[i].length
1 <= m, n <= 200
board[i][j]
为'X'
或'O'
思路
只有和边界上相连的‘O’才不会被包围,因此我们可以对矩阵边界上的所有'O'进行深度优先搜索,将这部分‘O’全部用一个其他的字符标记,然后再遍历矩阵,剩下的‘O’就是内部的‘O’,这部分'O'则需要全部变成'X',最后再将刚才标记过得不需要替换的'O'变回来即可。
C++ Code
class Solution {
public:
void dfs(int i, int j, vector<vector<char>>& board){
if( i<0 || i>=board.size() || j<0 || j>=board[0].size() || board[i][j]!='O') return;
board[i][j]='1';
dfs(i+1,j,board);
dfs(i-1,j,board);
dfs(i,j+1,board);
dfs(i,j-1,board);
}
void solve(vector<vector<char>>& board) {
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[0].size();j++)
{
if(i==0||j==0||i==board.size()-1||j==board[0].size()-1)
if(board[i][j]=='O') dfs(i,j,board);
}
}
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[0].size();j++)
{
if(board[i][j]=='O') board[i][j]='X';
}
}
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[0].size();j++)
{
if(board[i][j]=='1') board[i][j]='O';
}
}
}
};