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
leetcode 上的坑爹题,看了半天才明白题意。 就是把所有和边界上O不连通的O变成X。。。。 就这个意思。。。
裸上flood fill...边界上开始BFS, mark起来。。。然后后面所有的mark的为O,不mark得为X
class Solution {
public:
void solve(vector<vector<char> >& board) {
if (board.empty())
return;
if (board[0].empty())
return;
for (int i = 0; i < board.size(); i++) {
flood(board, i, 0);
flood(board, i, board[0].size() - 1);
}
for (int i = 0; i < board[0].size(); i++) {
flood(board, 0, i);
flood(board, board.size() - 1, i);
}
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[0].size(); j++) {
if (board[i][j] == 'B') {
board[i][j] = 'O';
continue;
}
if (board[i][j] == 'O') {
board[i][j] = 'X';
}
}
}
}
void flood(vector<vector<char> >& board, int w, int h) {
if (board[w][h]!='O')
return;
int width = board.size();
int height = board[0].size();
queue<pair<int, int> > q;
q.push(make_pair(w, h));
board[w][h] = 'B';
while (!q.empty()) {
pair<int, int> cur = q.front();
q.pop();
int up = cur.first - 1;
int down = cur.first + 1;
int left = cur.second - 1;
int right = cur.second + 1;
if (up >= 0 && up < width && cur.second >= 0 && cur.second < height
&& board[up][cur.second] == 'O') {
board[up][cur.second] = 'B';
q.push(make_pair(up, cur.second));
}
if (down >= 0 && down < width && cur.second >= 0
&& cur.second < height && board[down][cur.second] == 'O') {
board[down][cur.second] = 'B';
q.push(make_pair(down, cur.second));
}
if (cur.first >= 0 && cur.first < width && left >= 0
&& left < height && board[cur.first][left] == 'O') {
board[cur.first][left] = 'B';
q.push(make_pair(cur.first, left));
}
if (cur.first >= 0 && cur.first < width && right >= 0
&& right < height && board[cur.first][right] == 'O') {
board[cur.first][right] = 'B';
q.push(make_pair(cur.first, right));
}
}
}
};