首先初始化queue为最外面一圈的'O'的位置,然后bfs,把所有能到达的'O'标记为'Z',这样剩余的'O'变成'X','Z'变成‘O’就行了
class Solution {
struct point{int x,y;
point(int a,int b):x(a),y(b){}
};
public:
void solve(vector<vector<char>> &board) {
if(board.empty()||board.size()==0||board[0].size()==0)
return;
int m=board.size(),n=board[0].size();
queue<point> queue;
//初始化
for(int i=0;i<n;i++){
if(board[0][i]=='O'){
board[0][i]='Z';
queue.push(point(0,i));
}
if(board[m-1][i]=='O'){
board[m-1][i]='Z';
queue.push(point(m-1,i));
}
}
for(int i=0;i<m;i++){
if(board[i][0]=='O'){
board[i][0]='Z';
queue.push(point(i,0));
}
if(board[i][n-1]=='O'){
board[i][n-1]='Z';
queue.push(point(i,n-1));
}
}
//BFS
while(!queue.empty()){
point p=queue.front();
queue.pop();
if(p.x>0&&board[p.x-1][p.y]=='O'){
board[p.x-1][p.y]='Z';
queue.push(point(p.x-1,p.y));
}
if(p.x<m-1&&board[p.x+1][p.y]=='O'){
board[p.x+1][p.y]='Z';
queue.push(point(p.x+1,p.y));
}
if(p.y>0&&board[p.x][p.y-1]=='O'){
board[p.x][p.y-1]='Z';
queue.push(point(p.x,p.y-1));
}
if(p.y<n-1&&board[p.x][p.y+1]=='O'){
board[p.x][p.y+1]='Z';
queue.push(point(p.x,p.y+1));
}
}
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
board[i][j]=='Z'?board[i][j]='O':board[i][j]='X';
return;
}
};