给一个二维的矩阵,包含 'X'
和 'O'
, 找到所有被 'X'
围绕的区域,并用 'X'
替换其中所有的 'O'
。
样例
样例 1:
输入:
X X X X
X O O X
X X O X
X O X X
输出:
X X X X
X X X X
X X X X
X O X X
样例 2:
输入:
X X X X
X O O X
X O O X
X O X X
输出:
X X X X
X O O X
X O O X
X O X X
解题思路:
从每个边界的 'O'
开始遍历, 只访问 'O'
, 先都暂时设置为 'T'
或其他字符.
遍历结束之后, 将剩下的 'O'
替换为 'X'
然后再将 'T'
还原即可.
public class Solution {
/*
* @param board: board a 2D board containing 'X' and 'O'
* @return: nothing
*/
public void surroundedRegions(char[][] board) {
// write your code here
if(board == null || board.length == 0 || board[0].length == 0)
return;
row = board.length;
col = board[0].length;
//先遍历边界点,将边界点O及其关联O改变为T
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (i == 0 || i == row - 1 || j == 0 || j == col - 1) {
if (board[i][j] == 'O') {
dfs(board, i, j);
}
}
}
}
for(int i=0; i<row; i++){
for(int j=0; j<col;j++){
//剩下的矩阵中,不是X,也不是T,那就是被全部包围的O了,直接把他们变成X.
if(board[i][j] == 'O')
board[i][j] = 'X';
//再把剩下的不完全被包围的T还原成之前的O即可
if(board[i][j] == 'T')
board[i][j] = 'O';
}
}
}
int row;
int col;
int[][] p = {{1,0},{-1,0},{0,1},{0,-1}};
//以board[x][y]为起点深搜,将四周所有O,变为T
private void dfs(char[][] board,int x, int y){
if(x < 0 || x >= row || y < 0 || y >= col)
return;
if(board[x][y] != 'O')
return;
board[x][y] = 'T';
for(int i=0; i<4; i++){
dfs(board, x + p[i][0], y + p[i][1]);
}
}
}