37. 解数独
https://www.programmercarl.com/0037.%E8%A7%A3%E6%95%B0%E7%8B%AC.html
class Solution {private boolean backtracking(char[][] board){for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[0].length; j++) {if (board[i][j] != '.'){//如果数字,跳过continue;}for (char k = '1';k <= '9'; k++){if (isValid(i, j, k, board)){//如果合法board[i][j] = k;//放置元素if (backtracking(board)) return true;// 如果找到合适一组立刻返回board[i][j] = '.';//回溯,撤回元素}}//找完还没找到return false;// 9个数都试完了,都不行,那么就返回false}}return true; // 遍历完没有返回false,说明找到了合适棋盘位置了}//合法性判断private boolean isValid(int row, int col, char val, char[][] board) {//判断行for (int i = 0; i < 9; i++) {if (board[row][i] == val){return false;}}//判断列for (int j = 0; j < 9; j++) {if (board[j][col] == val){return false;}}//判断九宫格内 这里两层for嵌套int startRow = (row / 3) * 3;int startCol = (col / 3) * 3;for (int i = startRow; i < startRow + 3; i++) { // 判断9方格里是否重复for (int j = startCol; j < startCol + 3; j++) {if (board[i][j] == val ) {return false;}}}return true;}public void solveSudoku(char[][] board) {backtracking(board);}}
