Saturday, September 14, 2013

Surrounded Regions


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