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';
}
}
}
};
本文详细介绍了如何利用BFS算法解决二维板上被X包围的O区域翻转问题,避免了DFS算法可能导致的超时情况。通过代码实现和实例演示,阐述了不同算法的效率对比。
505

被折叠的 条评论
为什么被折叠?



