class Solution {
private int m;
private int n;
private class Point{
int i;
int j;
Point(int i, int j){
this.i = i;
this.j = j;
}
}
public void bfs(int i_, int j_, char[][] board){
Queue<Point> queue = new LinkedList<>();
Point point = new Point(i_, j_);
queue.offer(point);
board[point.i][point.j] = '#';
while(!queue.isEmpty()){
Point p = queue.poll();
int i = p.i;
int j = p.j;
if(i > 0 && board[i - 1][j] == 'O'){
queue.offer(new Point(i - 1, j));
board[i - 1][j] = '#';
}
if(i < m - 1 && board[i + 1][j] == 'O'){
queue.offer(new Point(i + 1, j));
board[i + 1][j] = '#';
}
if(j > 0 && board[i][j - 1] == 'O'){
queue.offer(new Point(i , j - 1));
board[i][j - 1] = '#';
}
if(j < n -1 && board[i][j + 1] == 'O'){
queue.offer(new Point(i , j + 1));
board[i][j + 1] = '#';
}
}
}
public void solve(char[][] board) {
if(board.length == 0){
return;
}
m = board.length;
n = board[0].length;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if((i == 0 || i == m - 1 || j == 0 || j == n - 1) && board[i][j] == 'O'){
bfs(i, j, board);
}
}
}
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(board[i][j] == 'O'){
board[i][j] = 'X';
}
if(board[i][j] == '#'){
board[i][j] = 'O';
}
}
}
}
}