因为边界上的任何’O’都不会被替换为’X’,所以从边界上的’O’出发,找到和之相邻的的’O’,进行标记,然后进行扫描,将标记过的位置设置为’O’,其余位置设置为’X’
方法一:(深度优先)
class Solution {
public static void dfs(char[][] board,int i,int j) {
if(i<0 || j<0 || i==board.length || j==board[0].length || board[i][j]!='O') {
return;
}
board[i][j]='A';
int[][] directions=new int[][] {{0,-1},{0,1},{-1,0},{1,0}};
for(int index=0;index<4;index++) {
dfs(board,i+directions[index][0],j+directions[index][1]);
}
}
public void solve(char[][] board) {
int row=board.length;
if(row==0) {
return;
}
int col=board[0].length;
for(int i=0;i<row;i++) {
dfs(board,i,0);
dfs(board,i,col-1);
}
for(int j=1;j<col-1;j++) {
dfs(board,0,j);
dfs(board,row-1,j);
}
for(int i=0;i<row;i++) {
for(int j=0;j<col;j++) {
if(board[i][j]=='A') {
board[i][j]='O';
}else {
board[i][j]='X';
}
}
}
}
}
方法二:(广度优先)
class Solution {
public void solve(char[][] board) {
int row=board.length;
if(row==0) {
return;
}
int col=board[0].length;
Queue<int[]> queue=new LinkedList<int[]>();
for(int i=0;i<row;i++) {
if(board[i][0]=='O') {
queue.add(new int[] {i,0});
}
if(board[i][col-1]=='O') {
queue.add(new int[] {i,col-1});
}
}
for(int j=1;j<col-1;j++) {
if(board[0][j]=='O') {
queue.add(new int[] {0,j});
}
if(board[row-1][j]=='O') {
queue.add(new int[] {row-1,j});
}
}
int[][] directions= {{0,-1},{0,1},{1,0},{-1,0}};
while(!queue.isEmpty()) {
int[] curr=queue.poll();
int curri=curr[0],currj=curr[1];
board[curri][currj]='A';
for(int index=0;index<4;index++) {
int nexti=curri+directions[index][0],nextj=currj+directions[index][1];
if(nexti<0 || nextj<0 || nexti==row || nextj==col || board[nexti][nextj]!='O') {
continue;
}
queue.add(new int[] {nexti,nextj});
}
}
for(int i=0;i<row;i++) {
for(int j=0;j<col;j++) {
if(board[i][j]=='A') {
board[i][j]='O';
}else {
board[i][j]='X';
}
}
}
}
}