考点

for k in 0 to 9:
    temp_x = 3 * (x / 3) + k / 3
    temp_y = 3 * (y / 3) + k % 3

37. Sudoku Solver

class Solution {
    public void solveSudoku(char[][] board) {

        if (board == null || board.length == 0) return;

        solve(board);
    }

    private boolean solve(char[][] board){
        int n = board.length, m = board[0].length;

        for (int i = 0; i < n; i++){
            for (int j = 0; j < m; j++){
                if (board[i][j] == '.'){
                    for (char c = '1'; c <= '9'; c++){
                        if (valid(board, i, j, c)){
                            board[i][j] = c;

                            if (solve(board)){
                                return true;
                            }
                            else{
                                board[i][j] = '.';
                            }
                        }
                    }  

                    return false;
                }
            }
        }

        return true;
    }

    private boolean valid(char[][] board, int x, int y, char c){
        for (int k = 0; k < 9; k++){
            //col
            if (k != x && board[k][y] == c) return false;
            //row
            if (k != y && board[x][k] == c) return false;
            //grid
            int tempX = 3 * (x / 3) + k / 3;
            int tempY = 3 * (y / 3) + k % 3;
            if (tempX != x && tempY != y && board[tempX][tempY] == c) return false;
        }

        return true;
    }
}

36. Valid Sudoku

public class Solution {
    public boolean isValidSudoku(char[][] board) {

        boolean[] visited = new boolean[9];

        // col
        for (int i = 0; i < 9; i++){
            Arrays.fill(visited, false);
            for (int j = 0; j < 9; j++){
                if (!check(visited, board[i][j])){
                    return false;
                }
            }
        }

        // row
        for (int i = 0; i < 9; i++){
            Arrays.fill(visited, false);
            for (int j = 0; j < 9; j++){
                if (!check(visited, board[j][i])){
                    return false;
                }
            }
        }

        // grid
        for (int i = 0; i < 9; i+=3){
            for (int j = 0; j < 9; j+=3){
                Arrays.fill(visited, false);
                for (int k = 0; k < 9; k++){
                    if (!check(visited, board[i + k / 3][j + k % 3])){
                        return false;
                    }
                }
            }
        }

        return true;
    }

    private boolean check(boolean[] visited, char digit){
        if (digit == '.'){
            return true;
        }

        int num = digit - '0';
        if (num < 0 || num > 9 || visited[num - 1]){
            return false;
        }

        visited[num - 1] = true;
        return true;
    }
}

results matching ""

    No results matching ""