# 37 Sudoku Solver

## 37. [Sudoku Solver](https://leetcode.com/problems/sudoku-solver/description/)

## 1. Question

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

Empty cells are indicated by the character`'.'`.

You may assume that there will be only one unique solution.

![](http://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Sudoku-by-L2G-20050714.svg/250px-Sudoku-by-L2G-20050714.svg.png)

A sudoku puzzle...

![](http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Sudoku-by-L2G-20050714_solution.svg/250px-Sudoku-by-L2G-20050714_solution.svg.png)

...and its solution numbers marked in red.

## 2. Implementation

**(1) Backtracking**

```java
class Solution {
    public void solveSudoku(char[][] board) {
        if (board == null || board.length == 0) {
            return;
        }
        recSolveSudoku(board);
    }

    public boolean recSolveSudoku(char[][] board) {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j] == '.') {
                    for (char c = '1'; c <= '9'; c++) {                        
                        if (isValid(board, i, j, c)) {
                            board[i][j] = c;

                            if (recSolveSudoku(board)) {
                                return true;
                            }

                            board[i][j] = '.';
                        }
                    }
                    return false;
                }
            }
        }
        return true;
    }

    public boolean isValid(char[][] board, int row,  int col, char num) {
        for (int i = 0; i < 9; i++) {
            if (board[i][col] == num || board[row][i] == num) {
                return false;
            }

            if (board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == num) {
                return false;
            }
        }
        return true;
    }
}
```

## 3. Time & Space Complexity

**Backtracking:** 时间复杂度O(9^n),n是board为空格的个数, 空间复杂度O(n), 递归的深度最多为n
