classSolution{ privateint m, n; publicvoidsolve(char[][] board){ m = board.length; if(m == 0){ return; } n = board[0].length; //标记与边界相连的字母 O for(int i = 0; i < m; i++){ dfs(board, i, 0); dfs(board, i, n - 1); } //标记与边界相连的字母 O for(int i = 1; i < n - 1; i++){ dfs(board, 0, i); dfs(board, m - 1, i); } //处理每一个字母 for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ if(board[i][j] == 'A'){ board[i][j] = 'O'; }elseif(board[i][j] == 'O'){ board[i][j] = 'X'; } } }
} publicvoiddfs(char[][] board, int x, int y){ if(x < 0 || x >= m || y < 0 || y >= n || board[x][y] != 'O'){ return; } //标记与边界相连的字母 O board[x][y] = 'A'; dfs(board, x + 1, y); dfs(board, x - 1, y); dfs(board, x, y + 1); dfs(board, x, y - 1); } }
publicvoidsolve(char[][] board){ int m = board.length; if(m == 0){ return; } int n = board[0].length; Queue<int[]> queue = new LinkedList<>(); //将边界上的字母 O 坐标加入队列 for(int i = 0; i < m; i++){ if(board[i][0] == 'O') queue.offer(newint[]{i, 0}); if(board[i][n - 1] == 'O') queue.offer(newint[]{i, n - 1}); }
for(int i = 1; i < n - 1; i++){ if(board[0][i] == 'O') queue.offer(newint[]{0, i}); if(board[m - 1][i] == 'O')queue.offer(newint[]{m - 1, i}); } //将边界上的字母 O 坐标加入队列 while(!queue.isEmpty()){ //从队列中取出一个字母 O,对其标记 int[] t = queue.poll(); int x = t[0], y = t[1]; board[x][y] = 'A'; //将当前字母 O 相连的字母 O 坐标加入队列 for(int i = 0; i < 4; i++){ int nx = x + dx[i], ny = y + dy[i]; if(nx < 0 || nx >= m || ny < 0 || ny >= n || board[nx][ny] != 'O'){ continue; } queue.offer(newint[]{nx, ny}); } } //处理每一个字母 for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ if(board[i][j] == 'A'){ board[i][j] = 'O'; }elseif(board[i][j] == 'O'){ board[i][j] = 'X'; } } } } }