|
| 1 | +/* |
| 2 | +Sudoku Solver |
| 3 | +============= |
| 4 | +
|
| 5 | +Write a program to solve a Sudoku puzzle by filling the empty cells. |
| 6 | +A sudoku solution must satisfy all of the following rules: |
| 7 | +
|
| 8 | +Each of the digits 1-9 must occur exactly once in each row. |
| 9 | +Each of the digits 1-9 must occur exactly once in each column. |
| 10 | +Each of the digits 1-9 must occur exactly once in each of the 9 3x3 sub-boxes of the grid. |
| 11 | +The '.' character indicates empty cells. |
| 12 | +
|
| 13 | +Example 1: |
| 14 | +Input: board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]] |
| 15 | +Output: [["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]] |
| 16 | +Explanation: The input board is shown above and the only valid solution is shown below: |
| 17 | +
|
| 18 | +Constraints: |
| 19 | +board.length == 9 |
| 20 | +board[i].length == 9 |
| 21 | +board[i][j] is a digit or '.'. |
| 22 | +It is guaranteed that the input board has only one solution. |
| 23 | +*/ |
| 24 | + |
| 25 | +class Solution { |
| 26 | +public: |
| 27 | + bool valid(vector<vector<char>>& board, int r, int c, char val) { |
| 28 | + for(int i=0; i<9; ++i) { |
| 29 | + if(board[r][i] == val || board[i][c] == val) return false; |
| 30 | + } |
| 31 | + |
| 32 | + for(int i=0; i<3; ++i) { |
| 33 | + for(int j=0; j<3; ++j) { |
| 34 | + if(board[(r/3)*3 + i][(c/3)*3 + j] == val) return false; |
| 35 | + } |
| 36 | + } |
| 37 | + |
| 38 | + return true; |
| 39 | + } |
| 40 | + |
| 41 | + bool backtrack(vector<vector<char>>& board, int r, int c){ |
| 42 | + if(r == 9) return true; |
| 43 | + if(c == 9) return backtrack(board, r+1, 0); |
| 44 | + |
| 45 | + if(board[r][c] != '.') return backtrack(board, r, c+1); |
| 46 | + |
| 47 | + for(char ch = '1'; ch <= '9'; ++ch) { |
| 48 | + if(valid(board, r, c, ch)) { |
| 49 | + board[r][c] = ch; |
| 50 | + if(backtrack(board, r, c+1)) return true; |
| 51 | + board[r][c] = '.'; |
| 52 | + } |
| 53 | + } |
| 54 | + |
| 55 | + return false; |
| 56 | + } |
| 57 | + |
| 58 | + void solveSudoku(vector<vector<char>>& board) { |
| 59 | + backtrack(board, 0, 0); |
| 60 | + } |
| 61 | +}; |
| 62 | + |
0 commit comments