Leetcode 37 Solution

This article provides solution to leetcode question 37 (sudoku-solver)

https://leetcode.com/problems/sudoku-solver

Thinking Process

This is a graph search problem. We are going to use our position and our board as our state (i, j, board). We start from (0, 0, original_board), and walk our ways from top left to the right bottom.

For each state (i, j, curr_board), we are going to check what number we can place on this position. Use each possible number to fill up the current position, and go to the next state (next_i, next_j, next_board). As long as we go get to the last position, we solve the sudoku. Otherwise, there is no solution.

Time & Space Complexity

Assuming the size of the board is N x N:

  • Time complexity: O(9^(N * N))
  • Space complexity: O(M * N)

Solution

class Solution {
public:
    bool isSudoku(vector<vector<char>>& board, int i, int j)
    {
        for (int k = 0; k < 9; k++)
        {
            if (board[i][j] == board[i][k] && j != k)
                return false;

            if (board[i][j] == board[k][j] && i != k)
                return false;
        }

        for (int row = i / 3 * 3; row < i / 3 * 3 + 3; row++)
        {
            for (int col = j / 3 * 3; col < j / 3 * 3 + 3; col++)
            {
                if (row == i && col == j)
                    continue;

                if (board[row][col] == board[i][j])
                    return false;
            }
        }

        return true;
    }

    bool solveSudoku(vector<vector<char>>& board, int i, int j) {
        if (i == 9)
            return true;
        else if (j == 9)
            return solveSudoku(board, i + 1, 0);
        else if (board[i][j] == '.')
        {
            for (int k = 1; k <= 9; k++)
            {
                board[i][j] = k + '0';
                if (isSudoku(board, i, j) && solveSudoku(board, i, j + 1))
                    return true;
            }
            board[i][j] = '.';
        }
        else
            return solveSudoku(board, i, j + 1);

        return false;
    }

    void solveSudoku(vector<vector<char>>& board) {
        solveSudoku(board, 0, 0);
    }
};