LeetCode - 37. 解数独(回溯法)
和八皇后问题类似,横向、纵向、斜角问题判断
方法一:(回溯法)
class Solution {
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 (isVaild(board,i,j,c)){
board[i][j] = c; //填入这个数
if (solve(board))
return true; //如果棋盘能解决的话,就说明问题解决了,return true
else
board[i][j] = '.'; //恢复上一个状态,回溯
}
}
return false;
}
}
}
return true;
}
/**
* 判断棋盘的合法性
* @param board
* @param row
* @param col
* @param c
* @return
*/
private boolean isVaild(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;//检查行是否合法
if (board[row][i] != '.' && board[row][i] == c) return false;//检查列是否合法
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;//检查3*3的格子是否合法
}
return true;
}
}
方法二:回溯+状态压缩