package leetcode;
public class demo_130 {
public void solve(char[][] board) {
int m=board.length;
int n=board[0].length;
//如果只有一行一列或者二维数组为空,则跳过
if(m<=1||n<=1) {return;}
//设计一个辅助数组,记录需要变换的位置
int[][] flag=new int[m][n];
//不会被变换只会发生在与边'O'相邻的位置
for(int i=0;i<m;i++) {
if(board[i][0]=='O') {
flag[i][0]=1;
oneflag(board, flag, i, 0, m, n);
}
if(board[i][n-1]=='O') {
flag[i][n-1]=1;
oneflag(board, flag, i, n-1, m, n);
}
}
for(int j=0;j<n;j++) {
if(board[0][j]=='O') {
flag[0][j]=1;
oneflag(board, flag, 0, j, m, n);
}
if(board[m-1][j]=='O') {
flag[m-1][j]=1;
oneflag(board, flag, m-1, j, m, n);
}
}
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
if(board[i][j]=='O'&&flag[i][j]==0) {
board[i][j]='X';
}
System.out.print(board[i][j]);
}
System.out.println();
}
}
public void oneflag(char[][] board,int[][] flag,int i,int j,int m,int n) {
//递归想上找
if(i-1>-1) {
if(board[i-1][j]=='O'&&flag[i-1][j]==0) {
flag[i-1][j]=1;
oneflag(board, flag, i-1,j,m,n);
}
}
//递归向下找
if(i+1<m) {
if(board[i+1][j]=='O'&&flag[i+1][j]==0) {
flag[i+1][j]=1;
oneflag(board, flag, i+1,j,m,n);
}
}
//递归向左找
if(j-1>-1) {
if(board[i][j-1]=='O'&&flag[i][j-1]==0) {
flag[i][j-1]=1;
oneflag(board, flag, i, j-1,m,n);
}
}
//递归向右找
if(j+1<n) {
if(board[i][j+1]=='O'&&flag[i][j+1]==0) {
flag[i][j+1]=1;
oneflag(board, flag, i, j+1,m,n);
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
demo_130 d130 =new demo_130();
char[][] board= {{'X','X','X','X'},{'X','O','O','X'},{'X','X','O','X'},{'X','O','X','X'}};
d130.solve(board);
}
}