题目描述:
Given a 2D board containing 'X'
and 'O'
(the letter O), capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s in that surrounded region.
Example:
X X X X
X O O X
X X O X
X O X X
After running your function, the board should be:
X X X X
X X X X
X X X X
X O X X
Explanation:
Surrounded regions shouldn’t be on the border, which means that any 'O'
on the border of the board are not flipped to 'X'
. Any 'O'
that is not on the border and it is not connected to an 'O'
on the border will be flipped to 'X'
. Two cells are connected if they are adjacent cells connected horizontally or vertically.
给定一个矩阵,将被“X”保围的“O”改成“X”,可以从边界上的“O”开始遍历,所有你能访问得到的“O”都不可能被“X”包围,但是为了不重复访问,访问过的“O”需要进行标记,比如改成“T”,这样在递归搜索的时候避免重复搜索,搜索结束时候再将“T”改回成“O”。
class Solution {
public:
void solve(vector<vector<char>>& board) {
if(board.size()==0||board[0].size()==0) return;
int m=board.size();
int n=board[0].size();
for(int i=0;i<m;i++)
if(board[i][0]=='O') visit_surround(board,i,0);
for(int i=0;i<m;i++)
if(board[i][n-1]=='O') visit_surround(board,i,n-1);
for(int j=0;j<n;j++)
if(board[0][j]=='O') visit_surround(board,0,j);
for(int j=0;j<n;j++)
if(board[m-1][j]=='O') visit_surround(board,m-1,j);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(board[i][j]=='O') board[i][j]='X';
else if(board[i][j]=='T') board[i][j]='O';
}
}
}
void visit_surround(vector<vector<char>>& board, int i, int j)
{
int m=board.size();
int n=board[0].size();
board[i][j]='T';
if(i>0&&board[i-1][j]=='O') visit_surround(board,i-1,j);
if(i<m-1&&board[i+1][j]=='O') visit_surround(board,i+1,j);
if(j>0&&board[i][j-1]=='O') visit_surround(board,i,j-1);
if(j<n-1&&board[i][j+1]=='O') visit_surround(board,i,j+1);
}
};