Surrounded Regions
Feb 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) { if (board.size() == 0 ) return ; vector<vector<bool> > flag(board.size()); for (int i = 0; i < board.size(); ++i) { flag[i].resize(board.size(), false); } int dx[] = {0, 0, -1, 1}; int dy[] = {1, -1, 0, 0}; char xxx = 'X'; for (int i = 1; i < board.size() - 1; ++i) { for (int j = 1; j < board.size() - 1; ++j) { if (flag[i][j]) continue; // flood fill if (board[i][j] == 'O') { set<pair<int, int> > s; queue<int> q; s.insert(make_pair(i, j)); flag[i][j] = true; q.push(i); q.push(j); bool is_fill = true; while (!q.empty()) { int x = q.front(); q.pop(); int y = q.front(); q.pop(); for (int k = 0; k < 4; ++k) { if (x+dx[k] < 0 || x+dx[k] >= board.size() || y+dy[k] < 0 || y+dy[k] >= board.size() ) continue; if (flag[x+dx[k]][y+dy[k]]) continue; if (board[x+dx[k]][y+dy[k]] == 'O') { flag[x+dx[k]][y+dy[k]] = true; s.insert(make_pair(x+dx[k], y+dy[k])); q.push(x+dx[k]); q.push(y+dy[k]); if (!is_fill || x+dx[k] == 0 || x+dx[k] == board.size()-1 || y+dy[k] == 0 || y+dy[k] == board.size() - 1) is_fill = false; } } } if (is_fill) { for (auto it = s.begin(); it != s.end(); ++it) { board[it->first][it->second] = xxx; } } } } } } };
脑残,又写一遍。
class Solution { public: void solve(vector<vector<char>> &board) { if (board.size() ==0 ) return; vector<vector<bool> > m(board.size()); for (int i = 0; i < board.size(); ++i) { m[i].resize(board[i].size()); fill(m[i].begin(), m[i].end(), 0); } for (int i = 0; i < board.size(); ++i) { floodfill(i, 0, board, m); floodfill(i, board[i].size()-1, board, m); } for (int i = 0; i < board[0].size(); ++i) { floodfill(0, i, board, m); floodfill(board.size()-1, i, board, m); } for (int i = 0; i < board.size(); i++) { for (int j = 0; j < board[i].size(); j++) { if (board[i][j] == 'O' && m[i][j] == false) board[i][j] = 'X'; } } } void floodfill(int r, int c, const vector<vector<char>>& board, vector<vector<bool>>& m) { if (board[r][c] == 'X' || m[r][c] == true) return; queue<pair<int,int> > q; int x,y, x2, y2; const int dx[] = {0, 0, 1, -1}; const int dy[] = {1, -1, 0, 0}; q.push(make_pair(r,c)); m[r][c] = true; while (!q.empty()) { x = q.front().first; y = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { x2 = x + dx[i]; y2 = y + dy[i]; if (inrange(x2, y2, board) && board[x2][y2] == 'O' && m[x2][y2] == false) { m[x2][y2] = true; q.push(make_pair(x2, y2)); } } } } bool inrange(int i, int j, const vector<vector<char>>& b) { return i >=0 && j >= 0 && i < b.size() && j < b[0].size(); } };
class Solution { public: int n, m; vector<vector<bool> > v; void solve(vector<vector<char>> &board) { auto &a = board; n = a.size(); if (n == 0) return; m = a[0].size(); v.clear(); for (int i = 0; i < n; i++) { v.push_back(vector<bool>(m, 0)); } //floodfill queue<int> x, y; for (int i = 0; i < m; i++) { if (a[0][i] == 'O') x.push(0), y.push(i); if (a[n-1][i] == 'O') x.push(n-1), y.push(i); } for (int i = 1; i < n-1; i++) { if (a[i][0] == 'O') x.push(i), y.push(0); if (a[i][m-1] == 'O') x.push(i), y.push(m-1); } int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; while (!x.empty()) { int curx = x.front(); x.pop(); int cury = y.front(); y.pop(); if (v[curx][cury] == true || a[curx][cury] != 'O') continue; v[curx][cury] = true; a[curx][cury] = '.'; for (int i = 0; i < 4; i++) { if (isOK(curx+dx[i], cury+dy[i]) && a[curx+dx[i]][cury+dy[i]] == 'O') { x.push(curx+dx[i]); y.push(cury+dy[i]); } } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i][j] == '.') a[i][j] = 'O'; else if (a[i][j] == 'O') a[i][j] = 'X'; } } } bool isOK(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m && v[x][y] == false; } };