方法一:dfs递归
将边界上的O及与其相邻的O标记为1,然后遍历数组,将1改为O,其它的都是X。
class Solution {
private:
void dfs(vector<vector<char>>& board,int i,int j){
if(i>=0 && i<board.size() && j>=0 && j<board[0].size() && board[i][j]=='O'){
board[i][j]='1'; //访问过的点,将O标记为1
dfs(board,i-1,j);
dfs(board,i+1,j);
dfs(board,i,j-1);
dfs(board,i,j+1);
}
}
public:
void solve(vector<vector<char>>& board) {
if(board.empty())
return ;
int rows=board.size(),cols=board[0].size();
for(int i=0;i<rows;i++){ //将左右边界上的O及与O相连的标记为1
dfs(board,i,0);
dfs(board,i,cols-1);
}
for(int j=1;j<cols-1;j++){ //将上下边界上的O及与O相连的标记为1
dfs(board,0,j);
dfs(board,rows-1,j);
}
for(int i=0;i<rows;i++){ //再次遍历,替换,将1改为0,其它都为X
for(int j=0;j<cols;j++){
if(board[i][j]=='1')
board[i][j]='O';
else
board[i][j]='X';
}
}
}
};
方法二:bfs 队列
class Solution {
public:
int dirs[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; //四个搜索方向
void solve(vector<vector<char>>& board) {
if(board.empty()) return ;
int rows=board.size(),cols=board[0].size();
queue<pair<int,int>> q; //队列中的元素为pair类型,坐标的x,y
for(int i=0;i<rows;i++){ //将左右边界上的O的位置入队
if(board[i][0]=='O')
q.push({i,0});
if(board[i][cols-1]=='O')
q.push({i,cols-1});
}
for(int j=1;j<cols-1;j++){ //将上下边界上的O的位置入队
if(board[0][j]=='O')
q.push({0,j});
if(board[rows-1][j]=='O')
q.push({rows-1,j});
}
while(!q.empty()){
int x=q.front().first,y=q.front().second;
q.pop();
board[x][y]='1'; //遍历到的点标记为1
for(int i=0;i<4;i++){ //分别向4个方向搜索
int nx=x+dirs[i][0],ny=y+dirs[i][1];
if(nx>=0 && nx<rows && ny>=0 && ny<cols && board[nx][ny]=='O') //符合要求入队
q.push({nx,ny});
}
}
for(int i=0;i<rows;i++){ //再次遍历,替换,将1改为0,其它都为X
for(int j=0;j<cols;j++){
if(board[i][j]=='1')
board[i][j]='O';
else
board[i][j]='X';
}
}
}
};