classSolution{privateintROWS;privateintCOLS;privateint[][] dir =newint[][]{{1,0},{-1,0},{0,1},{0,-1}};publicvoidsolve(char[][] board){ROWS= board.length;COLS= board[0].length;// Check border// 1 col. and last col.for(int i =0; i <ROWS;++i){if(board[i][0]=='O')bfs(board, i,0);if(board[i][COLS-1]=='O')bfs(board, i,COLS-1);}// Check 1 row and last rowfor(int j =0; j <COLS;++j){if(board[0][j]=='O')bfs(board,0, j);if(board[ROWS-1][j]=='O')bfs(board,ROWS-1, j);}// Flipfor(int row =0; row <ROWS;++row){for(int col =0; col <COLS;++col){if(board[row][col]=='O'){
board[row][col]='X';}elseif(board[row][col]=='#'){
board[row][col]='O';}}}}privatevoidbfs(char[][] board,int r,int c){Queue<int[]> q =newLinkedList<>();// Add the starting position
q.offer(newint[]{r, c});// Flip to # to mark 'O'
board[r][c]='#';while(!q.isEmpty()){int row = q.peek()[0];int col = q.peek()[1];
q.poll();for(int i =0; i <4;++i){int adjX = row + dir[i][0];int adjY = col + dir[i][1];// Check out of boundif(adjX <0|| adjX >=ROWS|| adjY <0|| adjY >=COLS)continue;// Only care 'O'if(board[adjX][adjY]!='O')continue;// Mark as '#'
board[adjX][adjY]='#';// Add to queue
q.offer(newint[]{adjX, adjY});}}}}