【leetcode】37. Sudoku Solver

Write a program to solve a Sudoku puzzle by filling the empty cells.

A sudoku solution must satisfy all of the following rules:

  1. Each of the digits 1-9 must occur exactly once in each row.
  2. Each of the digits 1-9 must occur exactly once in each column.
  3. Each of the the digits 1-9 must occur exactly once in each of the 9 3x3 sub-boxes of the grid.

Empty cells are indicated by the character '.'.


A sudoku puzzle...


...and its solution numbers marked in red.

Note:

  • The given board contain only digits 1-9 and the character '.'.
  • You may assume that the given Sudoku puzzle will have a single unique solution.
  • The given board size is always 9x9.

題解如下:

回溯法的典型例題

class Solution {
    public void solveSudoku(char[][] board) {
        if(board == null)
            return;
        solve(board);
    }
    
    public boolean solve(char[][] board) {
        for(int i = 0;i < 9;i++) {
            for(int j = 0;j < 9;j++) {
                if(board[i][j] == '.') {
                    //can fill
                    for(char num = '1';num <= '9';num++) {
                        
                        if(isValid(board,i,j,num)) {
                            board[i][j] = num;
                            if(solve(board))
                                return true;
                            board[i][j] = '.';
                        }   
                    }
                    return false;
                }
            }
        }
        return true;
    }
    
    public boolean isValid(char[][] board,int row,int col,char c){
        //檢測行
        for(int i = 0;i < 9;i++) {
            if(board[row][i] == c)
                return false;
        }
        //檢測列
        for(int i = 0;i < 9;i++) {
            if(board[i][col] == c) {
                return false;
            }
        }
        //檢測小九宮格
        for(int i = 0;i < 9;i++) {
            if(board[3*(row/3)+i/3][3*(col/3)+i%3] == c)
                return false;
        }
        return true;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章