给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。
找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。
示例:
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
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
思路:深度优先遍历四条边上的‘O‘,将其置为‘P’(即不需要修改为‘X’的‘O’元素),然后遍历矩阵,将‘O’置为‘X’,‘P’置为‘O’
Java代码:
public void solve(char[][] board) {
int m = board.length;
if (0 != m) {
int n = board[0].length;
// 深度遍历四条边上的'O',置为'P',即不需要修改为'X'的元素
for (int j = 0; j < n; j++) {
if ('O' == board[0][j])
dfs(0, j, m, n , board);
if ('O' == board[m-1][j])
dfs(m-1, j, m, n, board);
}
for (int i = 0; i < m; i++) {
if ('O' == board[i][0])
dfs(i, 0, m, n, board);
if ('O' == board[i][n-1])
dfs(i, n-1, m, n, board);
}
for (int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if('X' == board[i][j])
continue;
board[i][j] = 'P' == board[i][j] ? 'O' : 'X';
}
}
}
}
private void dfs(int line, int col, int m, int n, char[][] board) {
board[line][col] = 'P';
if (line > 0 && 'O' == board[line-1][col])
dfs(line-1, col, m, n, board);
if (line < m-1 && 'O' == board[line+1][col])
dfs(line+1, col, m, n, board);
if (col > 0 && 'O' == board[line][col-1])
dfs(line, col-1, m, n, board);
if (col < n-1 && 'O' == board[line][col+1])
dfs(line, col+1, m, n, board);
}