Solution:
May use the breadth first search strategy. And the search will be easier if it starts from the edges towards the inside. A visit matrix will be used to track the position visited (an alternative way is to set value of the board[i][j] that can not be surrounded from 'O' to be some other value rather than 'O' or 'X').
Code:
class Solution { public: void solve(vector<vector<char>>& board) { int m = board.size(); if(!m) return; int n = board.front().size(); if(!n) return; vector<vector<bool>> visit(m, vector<bool>(n, false)); for(int i=0; i<m; ++i){ for(int j=0; j<n; ++j){ if(board[i][j] == 'O' && !visit[i][j] && (i == 0 || i == m-1 || j == 0 || j == n-1)) sBSF(board, i, j, visit); } } for(int i=0; i<m; ++i){ for(int j=0; j<n; ++j){ if(!visit[i][j] && board[i][j] == 'O') board[i][j] = 'X'; } } } private: void sBSF(vector<vector<char>> &b, int x, int y, vector<vector<bool>> &v){ v[x][y] = true; queue<pair<int, int>> q; //for BSF; q.push(make_pair(x, y)); while(q.size()){ int x1 = q.front().first; //need to updated for each loop; int y1 = q.front().second; //same here; q.pop(); if(x1-1>=0 && b[x1-1][y1] == 'O' && !v[x1-1][y1]){//left; v[x1-1][y1] = true; q.push(make_pair(x1-1, y1)); } if(x1+1<b.size() && b[x1+1][y1] == 'O' && !v[x1+1][y1]){//right; v[x1+1][y1] = true; q.push(make_pair(x1+1, y1)); } if(y1-1>=0 && b[x1][y1-1] == 'O' && !v[x1][y1-1]){//up; v[x1][y1-1] = true; q.push(make_pair(x1, y1-1)); } if(y1+1<b.front().size() && b[x1][y1+1] == 'O' && !v[x1][y1+1]){//down; v[x1][y1+1] = true; q.push(make_pair(x1, y1+1)); } } } };
No comments :
Post a Comment