这道题可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。首先,我们需要遍历整个矩阵,找到所有被 'X' 包围的区域。我们可以从矩阵的边界开始进行搜索,因为边界上的 'O' 不可能被 'X' 包围。
以下是使用深度优先搜索的算法:
- 遍历矩阵的边界,找到所有为 'O' 的点,将其标记为已访问(visited)。
- 对于每个已访问的点,进行深度优先搜索。对于当前访问的点,如果其相邻的点是 'O' 且未访问过,则标记为已访问,并将其加入到搜索队列中。如果当前访问的点位于矩阵的边界,则该区域不被 'X' 包围。
- 完成遍历后,所有未标记为已访问的 'O' 都不被 'X' 包围,将其填充为 'X'。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param board char字符型二维数组
* @return char字符型二维数组
*/
public char[][] surroundedArea (char[][] board) {
if (board == null || board.length == 0 || board[0].length == 0) {
return board;
}
int m = board.length, n = board[0].length;
// 遍历边界
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);
}
// 处理内部的 O 和 X
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == 'O') {
board[i][j] = 'X';
} else if (board[i][j] == '#') {
board[i][j] = 'O';
}
}
}
return board;
}
private void dfs(char[][] board, int i, int j) {
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length ||
board[i][j] != 'O') {
return;
}
board[i][j] = '#';
dfs(board, i + 1, j);
dfs(board, i - 1, j);
dfs(board, i, j + 1);
dfs(board, i, j - 1);
}
}

京公网安备 11010502036488号