Given a 2D board containing 'X'
and 'O'
, capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s in that surrounded region.
For 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
本题使用最基本的宽度优先搜索,以队列进行节点的扩展。
class Solution {
public:
int dif[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
void dfs(vector<vector<char>>& board,pair<int,int> idx)
{
queue<pair<int,int>> que;
que.push(idx);
int n=board.size(),m=board[0].size();
board[idx.first][idx.second]='+';
while(!que.empty())
{
pair<int,int> cur = que.front();
que.pop();
int x = cur.first,y = cur.second;
for(int i=0;i<4;++i)
{
int xx = x+dif[i][0];
int yy = y+dif[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&board[xx][yy]=='O')
{
board[xx][yy]='+';
que.push(make_pair(xx,yy));
}
}
}
}
void solve(vector<vector<char>>& board) {
int n=board.size();
if(n==0) return;
int m=board[0].size();
if(m==0) return;
for(int i=0;i<n;++i)
{
if(board[i][0]=='O') dfs(board,make_pair(i,0));
if(board[i][m-1]=='O') dfs(board,make_pair(i,m-1));
}
for(int i=0;i<m;++i)
{
if(board[0][i]=='O') dfs(board,make_pair(0,i));
if(board[n-1][i]=='O') dfs(board,make_pair(n-1,i));
}
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
{
if(board[i][j]=='O') board[i][j]='X';
else if(board[i][j]=='+') board[i][j]='O';
}
}
};