题目:
Given a 2D board containing'X'and'O', capture all regions surrounded by'X'.
A region is captured by flipping all'O's into'X's in that surrounded region .
For example,
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X
思路:
1、从边缘入手,因为和边缘上的‘O’相连的‘O’都不会变,所以找出所有这样的‘O’,剩下的‘O’就是被完全包围的,把它们全部变为‘X’。
2、DFS过程中,暂时把遍历过的‘O'用另外一个符号’#‘代替,最后把被包围的’O‘变成’X'后,在把‘#’恢复成‘O’。
代码:
public class Solution { public void solve(char[][] board) { int row = board.length; if(row<3){ return; } int col = board[0].length; if(col < 3){ return; } //首列和最后一列 for(int i=0;i<row;i++){ if(board[i][0]=='O'){ board[i][0] ='#'; dfs(board,i,0); } if(board[i][col-1]=='O'){ board[i][col-1]='#'; dfs(board,i,col-1); } } //首行和最后一行 for(int j=0;j<col;j++){ if(board[0][j]=='O'){ board[0][j]='#'; dfs(board,0,j); } if(board[row-1][j]=='O'){ board[row-1][j]='#'; dfs(board,row-1,j); } } for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ if(board[i][j]=='O'){ board[i][j]='X'; } else if(board[i][j]=='#'){ board[i][j]='O'; } } } } public static void dfs(char[][] board,int i,int j){ int row = board.length; int col = board[0].length; //遍历上面 if(i>1 && board[i-1][j] == 'O'){ board[i-1][j] = '#'; dfs(board,i-1,j); } //遍历下面 if(i<row-2&& board[i+1][j] == 'O'){ board[i+1][j] = '#'; dfs(board,i+1,j); } //遍历左面 if(j>1 && board[i][j-1] == 'O'){ board[i][j-1] = '#'; dfs(board,i,j-1); } //遍历上面 if(j<col-2 && board[i][j+1] == 'O'){ board[i][j+1] = '#'; dfs(board,i,j+1); } } }
Given a 2D board containing'X'and'O', capture all regions surrounded by'X'.
A region is captured by flipping all'O's into'X's in that surrounded region .
For example,
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X