美文网首页
面试遇到联通性问题

面试遇到联通性问题

作者: justonemoretry | 来源:发表于2021-08-11 08:54 被阅读0次
image.png

解法

这个题原题是把被1包围的联通的0,全部改为1。当时没刷过这类题完全没经验,思路就是找四条边上为0的点,因为只有这些0联通的0才是不被包围的,记录下来打上标记,后面把其它0给改为1。
因为原题没有看到,这个X,O的题也可以类比为0,1,下面上具体的解法

public static void solve(char[][] board) {
        // 边界判断,不然下面会越界
        if (board.length < 3 || board[0].length < 3) {
            return;
        }
        // 竖向边界列,只有边上为O,才不会被X包围
        for (int i = 0; i < board.length; i++) {
            dfs(board, i, 0);
            dfs(board, i, board[0].length - 1);
        }
        // 横向边界行
        for (int j = 1; j < board[0].length -1; j++) {
            dfs(board, 0, j);
            dfs(board, board.length - 1, j);
        }
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
               // 没有标记的O,改为X 
               if (board[i][j] == 'O') {
                    board[i][j] = 'X';
                }
                // 被标记的O,还原成O
                if (board[i][j] == '*') {
                    board[i][j] = 'O';
                }
            }
        }
    }

    private static void dfs(char[][] grid, int i, int j) {
        if (i < 0 || i >= grid.length) {
            return;
        }
        if (j < 0 || j >= grid[0].length) {
            return;
        }
        // 不需要额外的是否访问过数组,这里为O就是没访问过
        if (grid[i][j] == 'O') {
            grid[i][j] = '*';
            int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
            for (int[] dir : dirs) {
                dfs(grid, i + dir[0], j + dir[1]);
            }
        }
    }

相关文章

网友评论

      本文标题:面试遇到联通性问题

      本文链接:https://www.haomeiwen.com/subject/bimqbltx.html