Preguntas de cepillado de LeetCode: sudoku eficaz y resolución de sudoku

sudoku válido

tema

Dado un Sudoku representado por una matriz bidimensional, determine si el Sudoku es un
vínculo válido.

tren de pensamiento

Utilice tres matrices booleanas bidimensionales para indicar si el número j aparece en la i-ésima fila, i-ésima columna y i-ésima cuadrícula de nueve cuadrados. Si un determinado número aparece repetidamente en una determinada fila, columna o nueve -cuadrícula, no hay solución para el Sudoku; recorrido exitoso Todas las cuadrículas tienen soluciones

class ValidSudoku {
    
    
    // 二维数组[i][j]表示第i行、列、九宫格中j数是否出现
    public static boolean isValidSudoku(char[][] board) {
    
    
        boolean[][] row = new boolean[9][10]; // 0位置不使用
        boolean[][] col = new boolean[9][10];
        boolean[][] bucket = new boolean[9][10]; // bucket表示九宫格
        for (int i = 0; i < 9; i++) {
    
    
            for (int j = 0; j < 9; j++) {
    
    
                // 求九宫格号
                int bid = 3 * (i / 3) + (j / 3);
                if (board[i][j] != '.') {
    
    
                    int num = board[i][j] - '0';
                    if (row[i][num] || col[j][num] || bucket[bid][num]) {
    
    
                        return false;
                    }
                    row[i][num] = true;
                    col[j][num] = true;
                    bucket[bid][num] = true;
                }
            }
        }
        return true;
    }
}

solución única para sudoku

tema

Dado un Sudoku representado por una matriz bidimensional, devuelve la solución del Sudoku. El título garantiza que el Sudoku tiene un
enlace de solución único.

tren de pensamiento

Igual que la pregunta anterior, use tres matrices bidimensionales para registrar si el número j aparece en la i-ésima fila, i-ésima columna y i-ésima cuadrícula de nueve cuadrados, y luego recorra las cuadrículas una por una, intente nueve números del 1 al 9 en cada cuadrícula por turno, y obtenga la solución única transversal

class SudokuSolver {
    
    

    public static void solveSudoku(char[][] board) {
    
    
        boolean[][] row = new boolean[9][10]; // 0位置不使用,表示第i行j数字是否出现
        boolean[][] col = new boolean[9][10]; // 表示第i列j数字是否出现
        boolean[][] bucket = new boolean[9][10]; // 表示第i个九宫格j数字是否出现
        initMaps(board, row, col, bucket);
        process(board, 0, 0, row, col, bucket);
    }

    public static void initMaps(char[][] board, boolean[][] row, boolean[][] col, boolean[][] bucket) {
    
    
        for (int i = 0; i < 9; i++) {
    
    
            for (int j = 0; j < 9; j++) {
    
    
                // 求九宫格号
                int bid = 3 * (i / 3) + (j / 3);
                if (board[i][j] != '.') {
    
    
                    int num = board[i][j] - '0';
                    row[i][num] = true;
                    col[j][num] = true;
                    bucket[bid][num] = true;
                }
            }
        }
    }

    public static boolean process(char[][] board, int i, int j, boolean[][] row, boolean[][] col, boolean[][] bucket) {
    
    
        if (i == 9) {
    
     // 到达终止位置
            return true;
        }
        // 跳到下一个位置
        int nexti = j != 8 ? i : i + 1;
        int nextj = j != 8 ? j + 1 : 0;
        if (board[i][j] != '.') {
    
    
            return process(board, nexti, nextj, row, col, bucket);
        } else {
    
    
            int bid = 3 * (i / 3) + (j / 3);
            for (int num = 1; num <= 9; num++) {
    
    
                // 检验行、列、九宫格是否有重复数字
                if (!row[i][num] && !col[j][num] && !bucket[bid][num]) {
    
    
                    row[i][num] = true;
                    col[j][num] = true;
                    bucket[bid][num] = true;
                    board[i][j] = (char) (num + '0');
                    if (process(board, nexti, nextj, row, col, bucket)) {
    
    
                        return true;
                    }
                    // 若尝试失败,则恢复现场
                    row[i][num] = false;
                    col[j][num] = false;
                    bucket[bid][num] = false;
                    board[i][j] = '.';
                }
            }
            return false;
        }

    }
}

Supongo que te gusta

Origin blog.csdn.net/wzc3614/article/details/129476539
Recomendado
Clasificación