130. 被围绕的区域
题目链接:130. 被围绕的区域
思路:使用两遍dfs,第一遍找到可以被替换区域的可进入点并记录,第二遍就从所有的可进入点入手遍历区域内所有点并替换。
这是我的思路,感觉还是挺新颖的(应该很少有人这样想我觉得),算是抛砖引玉了。
class Solution {int[] dx = {0, 0, 1, -1};int[] dy = {1, -1, 0, 0};boolean exit = false;// 判断是否可以退出public void solve(char[][] board) {// 定义一个记录矩阵判断某个点是否被走过int[][] record = new int[board.length][board[0].length];// 用一个数列存所有的可以进入点ArrayList<int[]> list = new ArrayList<>();// 遍历这个矩阵for(int i = 0; i < board.length; i++) {for (int j = 0; j < board[0].length; j++) {// 如果这个点没有被走过,并且是'O',则开始深度优先搜索if (record[i][j] == 0 && board[i][j] == 'O') {// 某个区域的进入点record[i][j] = 1;exit = false;dfsOnlyWalk(board, record, i, j);if(!exit) {list.add(new int[]{i, j});}}}}for(int[] ints : list) {int x = ints[0], y = ints[1];board[x][y] = 'X';dfsOnlyMark(board, record, x, y);}}public void dfsOnlyWalk(char[][] board, int[][] record, int i, int j) {//区域中有点位于边缘if(i == 0 || i == board.length - 1 || j == 0 || j == board[0].length - 1) {exit = true;}for(int k = 0; k < 4; k++) {int xx = i + dx[k];int yy = j + dy[k];if(xx >= 0 && xx < board.length && yy >= 0 && yy < board[0].length && record[xx][yy] == 0 && board[xx][yy] == 'O') {record[xx][yy] = 1;dfsOnlyWalk(board, record, xx, yy);}}}public void dfsOnlyMark(char[][] board, int[][] record, int i, int j) {for(int k = 0; k < 4; k++) {int xx = i + dx[k];int yy = j + dy[k];if(xx >= 0 && xx < board.length && yy >= 0 && yy < board[0].length && board[xx][yy] == 'O') {board[xx][yy] = 'X';dfsOnlyMark(board, record, xx, yy);}}}public static void main(String[] args) {Solution solution = new Solution();/** [["O","X","O","O","X","X"],["O","X","X","X","O","X"],["X","O","O","X","O","O"],["X","O","X","X","X","X"],["O","O","X","O","X","X"],["X","X","O","O","O","O"]]* */char[][] board = {{'O','X','O','O','X','X'},{'O','X','X','X','O','X'},{'X','O','O','X','O','O'},{'X','O','X','X','X','X'},{'O','O','X','O','X','X'},{'X','X','O','O','O','O'}};solution.solve(board);for(char[] chars : board) {for(char c : chars) {System.out.print(c + " ");}System.out.println();}}}