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
分析:只要字母o所在位置与边缘位置的o相连,其值则不变,否则则转为x
class Solution {
public:
void solve(vector<vector<char>> &board) {
int n = board.size();
if (n < 3) return;
int m = board[0].size();
if(m < 3)return;
vector<bool> visit(m, false);
vector<vector<bool>> v(n,visit);
queue<int> q;
for(int i = 0; i < n; i++)
{
if(board[i][0] == 'O')
{
q.push(i*m);
v[i][0] = true;
}
if(board[i][m-1] == 'O')
{
q.push(i*m + m-1);
v[i][m-1] = true;
}
}
for(int j = 0; j < m; j++)
{
if(board[0][j] == 'O')
{
q.push(j);
v[0][j] = true;
}
if(board[n-1][j] == 'O')
{
q.push((n-1)*m+j);
v[n-1][j] = true;
}
}
while(!q.empty())
{
int t = q.front();
int i = t/m;
int j = t%m;
if((i-1 > -1) && (board[i-1][j] == 'O') && (!v[i-1][j]))
{
q.push((i-1)*m+j);
v[i-1][j] = true;
}
if((j-1 > -1) && (board[i][j-1] == 'O') && (!v[i][j-1]))
{
q.push(i*m+j-1);
v[i][j-1] = true;
}
if((i+1 < n) && (board[i+1][j] == 'O') && (!v[i+1][j]))
{
q.push((i+1)*m+j);
v[i+1][j] = true;
}
if((j+1 < m) && (board[i][j+1] == 'O') && (!v[i][j+1]))
{
q.push(i*m+j+1);
v[i][j+1] = true;
}
q.pop();
}
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
if(board[i][j] == 'O' && v[i][j] == false)
{
board[i][j] = 'X';
}
}
return;
}
};