这道题可以使用深度优先搜索(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); } }