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
vector<vector<bool> > checked;
int xi[3] = {-1, 0, 1};
int yi[3] = {-1, 0, 1};
void explore(bool fliprequired, int i, int j, vector<vector<char> > &board)
{
queue<pair<int, int> > Q;
Q.push(make_pair(i, j));
while(Q.size() > 0 )
{
if(fliprequired)
board[i][j] = 'X';
checked[i][j] = true;
pair<int, int> rt = Q.front();
Q.pop();
for(int l = 0; l < 3; l++)
{
for(int r = 0; r < 3; r++)
{
int newx = rt.first + xi[l];
int newy = rt.second + yi[r];
if(newx >= 0 && newx < board.size() && newy >=0 && newy < board[0].size())
{
if(!checked[i][j] && board[newx][newy] == 'O')
{
Q.push(make_pair(newx, newy));
}
}
}
}
}
return ;
}
bool verify(int i, int j, vector<vector<char> > &board)
{
bool t = false, b = false, l = false, r = false;
for(int x = i ; x >=0 ; x--)
{
if(board[x][j] == 'X')
{
l = true;
break;
}
}
for(int x = i ; x < board.size() ; x++)
{
if(board[x][j] == 'X')
{
r = true;
break;
}
}
for(int x = j ; x >=0 ; x--)
{
if(board[i][x] == 'X')
{
t= true;
break;
}
}
for(int x = j ; x < board[0].size() ; x++)
{
if(board[i][x] == 'X')
{
b = true;
break;
}
}
if(t && b && l && r)
return true;
return false;
}
void solve(vector<vector<char> > &board) {
int m = board.size();
if(m <= 0)
return;
int n = board[0].size() ;
for(int i =0; i < m; i++)
{
vector<bool> x(false, n);
checked.push_back(x);
}
for(int i = 0; i < m ;i++)
{
for(int j = 0; j < n; j++)
{
if(board[i][j] == 'O' && checked[i][j] == false)
{
bool flipneeded = verify(i, j, board);
explore(flipneeded, i, j, board);
}
}
}
}
No comments:
Post a Comment