import java.util.*;
public class Solution {
public void solve(char[][] board) {
if(board.length==0||board.length==1){
return;
}
TreeSet<String> allBoundaryO = findAllBoundaryO(board);
int yLimt=board.length;
int xLimt=board[1].length;
for(int i=0;i<yLimt;i++){
for(int j=0;j<xLimt;j++){
if('O'==board[i][j]&&!allBoundaryO.contains(i+"-"+j)){
board[i][j]='X';
}
}
}
}
public TreeSet<String> findAllBoundaryO(char[][] board) {
TreeSet<String> result =new TreeSet<>();
int yLimt = board.length-1;
int xLimt = board[1].length-1;
for (int i = 0; i <= xLimt; i++) {
if('O'==board[yLimt][i]){
result.add(yLimt+"-"+i);
getThisNeiO(board,yLimt,i,result);
}
if('O'==board[0][i]){
result.add( 0+"-"+i);
getThisNeiO(board,0,i,result);
}
}
for (int i = 0; i <= yLimt; i++) {
if('O'==board[i][xLimt]){
result.add(i+"-"+xLimt);
getThisNeiO(board,i,xLimt,result);
}
if('O'==board[i][0]){
result.add(i+"-"+0);
getThisNeiO(board,i,0,result);
}
}
return result;
}
private void getThisNeiO(char[][] board, int x, int y, TreeSet<String> result) {
if(judgeIsValid(board,x-1,y) && 'O'==board[x-1][y]) {
if(!result.contains(x-1+"-"+y)){
result.add(x-1+"-"+y);
getThisNeiO(board,x-1,y,result);
}
}
if(judgeIsValid(board,x+1,y) && 'O'==board[x+1][y]){
if(!result.contains(x+1+"-"+y)){
result.add(x+1+"-"+y);
getThisNeiO(board,x+1,y,result);
}
}
if(judgeIsValid(board,x,y-1) && 'O'==board[x][y-1]){
if(!result.contains(x+"-"+(y-1))){
result.add(x+"-"+ (y-1));
getThisNeiO(board,x,y-1,result);
}
}
if(judgeIsValid(board,x,y+1) && 'O'==board[x][y+1]){
if(!result.contains(x+"-"+(y+1))){
result.add(x+"-"+(y+1));
getThisNeiO(board,x,y+1,result);
}
}
}
public boolean judgeIsValid(char[][] board, int x,int y){
int yLimt=board.length-1;
int xLimt=board[1].length-1;
if( x>=0 && x<=yLimt && y>=0 &&y<=xLimt){
return true;
}
return false;
}
}