这道题可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。首先,我们需要遍历整个矩阵,找到所有被 'X' 包围的区域。我们可以从矩阵的边界开始进行搜索,因为边界上的 'O' 不可能被 'X' 包围。

以下是使用深度优先搜索的算法:

  1. 遍历矩阵的边界,找到所有为 'O' 的点,将其标记为已访问(visited)。
  2. 对于每个已访问的点,进行深度优先搜索。对于当前访问的点,如果其相邻的点是 'O' 且未访问过,则标记为已访问,并将其加入到搜索队列中。如果当前访问的点位于矩阵的边界,则该区域不被 'X' 包围。
  3. 完成遍历后,所有未标记为已访问的 '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);
    }
}