Surrounded RegionsFeb 22
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: void solve(vector<vector<char>> &board) { // Start typing your C/C++ solution below // DO NOT write int main() function if (board.size() <= 1) return; int rows = board.size(); int cols = board[0].size(); vector<vector<bool>> visited(rows, vector<bool>(cols, false)); vector<vector<bool>> checked(rows, vector<bool>(cols, false)); for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { if (!visited[i][j]) { if (board[i][j] == 'O') { if (checkIfSurrounded(i, j, board, visited, checked)) { markChecked(i, j, board, checked); } } else { visited[i][j] = true; } } } } } bool checkIfSurrounded(int i, int j, vector<vector<char>> &board, vector<vector<bool>> &visited, vector<vector<bool>> &checked) { queue<Pos> q; bool result = true; q.push(Pos(i, j)); visited[i][j] = true; while (!q.empty()) { Pos pos = q.front(); q.pop(); i = pos.row; j = pos.col; checked[i][j] = true; if (j - 1 >= 0) { if (board[i][j - 1] == 'O' && !visited[i][j - 1]) { q.push(Pos(i, j - 1)); visited[i][j - 1] = true; } } else { result = false; } if (j + 1 < board[0].size()) { if (board[i][j + 1] == 'O' && !visited[i][j + 1]) { q.push(Pos(i, j + 1)); visited[i][j + 1] = true; } } else { result = false; } if (i + 1 < board.size()) { if (board[i + 1][j] == 'O' && !visited[i + 1][j]) { q.push(Pos(i + 1, j)); visited[i + 1][j] = true; } } else { result = false; } if (i - 1 >= 0) { if (board[i - 1][j] == 'O' && !visited[i - 1][j]) { q.push(Pos(i - 1, j)); visited[i - 1][j] = true; } } else { result = false; } } return result; } void markChecked(int i, int j, vector<vector<char>> &board, vector<vector<bool>> &checked) { queue<Pos> q; bool result = true; q.push(Pos(i, j)); while (!q.empty()) { Pos pos = q.front(); q.pop(); i = pos.row; j = pos.col; board[i][j] = 'X'; checked[i][j] = false; if (j - 1 >= 0) { if (checked[i][j - 1]) { q.push(Pos(i, j - 1)); checked[i][j - 1] = false; } } if (j + 1 < board[0].size()) { if (checked[i][j + 1]) { q.push(Pos(i, j + 1)); checked[i][j + 1] = false; } } if (i + 1 < board.size()) { if (checked[i + 1][j]) { q.push(Pos(i + 1, j)); checked[i + 1][j] = false; } } if (i - 1 >= 0) { if (checked[i - 1][j]) { q.push(Pos(i - 1, j)); checked[i - 1][j] = false; } } } } typedef struct Pos { int row, col; Pos(int i, int j): row(i), col(j) {}; }; };
No comments:
Post a Comment