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
用bfs沒問題
class Solution {
public:
int m,n;
queue<int> q;
void add(int x,int y,vector<vector<char>> &board){
if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O'){
board[x][y] = 'q';
q.push(x*n + y);
}
}
void bfs(int x,int y,vector<vector<char>> &board){
add(x,y,board);
while(!q.empty()){
int p = q.front();
q.pop();
int px = p / n,py = p % n;
add(px - 1,py,board);
add(px + 1,py,board);
add(px,py - 1,board);
add(px,py + 1,board);
}
}
void solve(vector<vector<char>> &board) {
if(board.empty()) return;
m = board.size();
n = board[0].size();
for(int i = 0;i < n;i ++){
bfs(0,i,board);
bfs(m - 1,i,board);
}
for(int i = 0;i < m;i ++){
bfs(i,0,board);
bfs(i,n - 1,board);
}
for(int i = 0;i < m;i ++){
for(int j = 0;j < n;j ++){
board[i][j] = (board[i][j] == 'q' ? 'O' : 'X');
}
}
}
};
用dfs會超時
class Solution {
public:
int m,n;
void dfs(int x,int y,vector<vector<char>> &board){
if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O'){
board[x][y] = 'q';
dfs(x - 1,y,board);
dfs(x + 1,y,board);
dfs(x,y - 1,board);
dfs(x,y + 1,board);
}
}
void solve(vector<vector<char>> &board) {
if(board.empty()) return;
m = board.size();
n = board[0].size();
for(int i = 0;i < n;i ++){
dfs(0,i,board);
dfs(m - 1,i,board);
}
for(int i = 0;i < m;i ++){
dfs(i,0,board);
dfs(i,n - 1,board);
}
for(int i = 0;i < m;i ++){
for(int j = 0;j < n;j ++){
board[i][j] = board[i][j] == 'q' ? 'O' : 'X';
}
}
}
};