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.
题解:找出被包围的o并转为x,本题用dfs很简单,但是需要注意入手角度,刚开始只从找出被包围的o入手结果要考虑边界的o以及形成o的并查集比较麻烦,所以应该先从边界四条的o开始dfs,并把这些o标记为1,然后遍历图,把所有o改为x,把1改为o即可
代码如下:
class Solution {
public:
void solve(vector<vector<char>> &board) {
int n=board.size();
if(n==0||n==1||n==2) return;
int m=board[0].size();
for(int i=0;i<n;i++){
dfs(i,0,board,n,m);
dfs(i,m-1,board,n,m);
}
for(int j=0;j<m;j++){
dfs(0,j,board,n,m);
dfs(n-1,j,board,n,m);
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(board[i][j]=='O') board[i][j]='X';
if(board[i][j]=='1') board[i][j]='O';
}
}
void dfs(int i,int j,vector<vector<char>>& board,int n,int m){
if(i<0||j<0||i>=n||j>=m) return;
if(board[i][j]=='O'){
board[i][j]='1';
dfs(i+1,j,board,n,m);
dfs(i-1,j,board,n,m);
dfs(i,j+1,board,n,m);
dfs(i,j-1,board,n,m);
}
}
};