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. // other’ s Try 1 through 9 for each cell. The time complexity should be 9 ^ m (m represents the number of blanks to be filled in), since each blank can have 9 choices. Details see comments inside code. public class Solution { public void solveSudoku(char[][] board) { if(board == null || board.length == 0) return; solve(board); } public boolean solve(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++){//trial. Try 1 through 9 if(isValid(board, i, j, c)){ board[i][j] = c; //Put c for this cell if(solve(board)) return true; //If it's the solution return true else board[i][j] = '.'; //Otherwise go back } } return false; } } } return true; } private boolean isValid(char[][] board, int row, int col, char c){ for(int i = 0; i < 9; i++) { if(board[i][col] != '.' && board[i][col] == c) return false; //check row if(board[row][i] != '.' && board[row][i] == c) return false; //check column if(board[3 * (row / 3) + i / 3][ 3 * (col / 3) + i % 3] != '.' && board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == c) return false; //check 3*3 block } return true; } }
two things:
带返回值的dfs recursion
if(board[3 * (row / 3) + i / 3][ 3 * (col / 3) + i % 3] != '.' &&
board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == c) return false;
Row : 3 * (row / 3) + i / 3
Col : 3 * (col / 3) + i % 3
x : 012/ 3 = 000 * 3 = 000 345/3 = 111 *3 = 333 678/3 = 222 * 3 = 666
y : 012/ 3 = 000 * 3 = 000 345/3 = 111 * 3 = 333 678/3 = 222 * 3 = 666
I = 0, 1 2 3 4 5 6 7 8 9
I/3 = 0 0 0 1 1 1 1 2 2 2
I%3= 0 1 2 0 1 2 0 1 2 0
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-9and the character'.'. - You may assume that the given Sudoku puzzle will have a single unique solution.
- The given board size is always
9x9.
posted on 2018-11-06 09:34 猪猪🐷 阅读(92) 评论(0) 收藏 举报
浙公网安备 33010602011771号