题目
解题思路
本题要求将所有被字母 X 包围的字母 O都变为字母 X ,但很难判断哪些 O 是被包围的,哪些 O 不是被包围的。
注意到题目解释中提到:任何边界上的 O 都不会被填充为 X。 我们可以想到,所有的不被包围的 O 都直接或间接与边界上的 O 相连。我们可以利用这个性质判断 O 是否在边界上,具体地说:
- 对于每一个边界上的 O,我们以它为起点,标记所有与它直接或间接相连的字母 O;
- 最后我们遍历这个矩阵,对于每一个字母:
class Solution {int[] dx = {1, -1, 0, 0};int[] dy = {0, 0, 1, -1};public void solve(char[][] board) {int n = board.length;if (n == 0) {return;}int m = board[0].length;Queue<int[]> queue = new LinkedList<int[]>();for (int i = 0; i < n; i++) {if (board[i][0] == 'O') {queue.offer(new int[]{i, 0});board[i][0] = 'A';}if (board[i][m - 1] == 'O') {queue.offer(new int[]{i, m - 1});board[i][m - 1] = 'A';}}for (int i = 1; i < m - 1; i++) {if (board[0][i] == 'O') {queue.offer(new int[]{0, i});board[0][i] = 'A';}if (board[n - 1][i] == 'O') {queue.offer(new int[]{n - 1, i});board[n - 1][i] = 'A';}}while (!queue.isEmpty()) {int[] cell = queue.poll();int x = cell[0], y = cell[1];for (int i = 0; i < 4; i++) {int mx = x + dx[i], my = y + dy[i];if (mx < 0 || my < 0 || mx >= n || my >= m || board[mx][my] != 'O') {continue;}queue.offer(new int[]{mx, my});board[mx][my] = 'A';}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (board[i][j] == 'A') {board[i][j] = 'O';} else if (board[i][j] == 'O') {board[i][j] = 'X';}}}}}
