130.被围绕的区域
解题思路
package leadcode;
/**
* @author : icehill
* @description : 被围绕的区域
* 给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,
* 并将这些区域里所有的 'O' 用 'X' 填充。
* 解题思路:
* 深度优先搜索
* 时间复杂度:O(m*n) 空间复杂度:O(m*n)(深度优先搜索的栈的开销)
* @date : 2021-05-09
*/
public class Solution130 {
public static void main(String[] args) {
char[][] board = {
{'X', 'X', 'X', 'X'},
{'X', 'O', 'O', 'X'},
{'X', 'X', 'O', 'X'},
{'X', 'O', 'X', 'X'}
};
Solution130 solution130 = new Solution130();
solution130.solve(board);
}
public void solve(char[][] board) {
int m = board.length;
int n = board[0].length;
//使用深度优先方法递归把所有边界上是'O'且与'O'相连通的元素设置为'A',
//那么剩下的元素'O'就是被'X'包围的了,再次遍历二维数组,把'A'变为'O',把'O'变为'X'即可
for (int i = 0; i < m; i++) {
dfs(board, i, 0);
dfs(board, i, n - 1);
}
for (int j = 0; j < n; j++) {
dfs(board, 0, j);
dfs(board, m - 1, j);
}
for (int row = 0; row < m; row++) {
for (int column = 0; column < n; column++) {
if (board[row][column] == 'A') {
board[row][column] = 'O';
} else if (board[row][column] == 'O') {
board[row][column] = 'X';
}
}
}
}
void dfs(char[][] board, int r, int l) {
if (r < 0 || r >= board.length || l < 0 || l >= board[0].length || board[r][l] != 'O') {
return;
}
board[r][l] = 'A';
dfs(board, r + 1, l);
dfs(board, r - 1, l);
dfs(board, r, l + 1);
dfs(board, r, l - 1);
}
}