https://leetcode.com/problems/sudoku-solver/description/
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.
A sudoku puzzle...
...and its solution numbers marked in red.
package go.jacob.day803;
/**
* 37. Sudoku Solver
* @author Jacob
* 思路:
* 简单地说思路就是循环处理子问题,对于每个格子,带入不同的9个数,
* 然后判合法,如果成立就递归继续,结束后把数字设回'.'
*
*/
public class Demo1 {
/*
* 回溯法:
*
*/
public void solveSudoku(char[][] board) {
if (board == null || board.length == 0)
return;
solve(board);
}
private 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] == '.') {
// 第一个'.'格一定是1-9中间的数
for (char c = '1'; c <= '9'; c++) {
if (isValid(board, i, j, c)) {
board[i][j] = c;
if (solve(board))
return true;
else
board[i][j] = '.';
}
}
/*
* 如果能够运行到这里,说明这个位置不能确定具体的数字
*/
return false;
}
}
}
return true;
}
// 判断是否是一个正确的数独。方法与leetcode36. Valid Sudoku一致
private boolean isValid(char[][] board, int row, int col, char c) {
for (int i = 0; i < board.length; i++) {
// 判断col列和row行是否满足数独条件
if (board[i][col] == c || board[row][i] == c)
return false;
// 判断九宫格
if (board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == c)
return false;
}
return true;
}
}