37. 解数独

https://www.programmercarl.com/0037.%E8%A7%A3%E6%95%B0%E7%8B%AC.html

  1. class Solution {
  2. private boolean backtracking(char[][] board){
  3. for (int i = 0; i < board.length; i++) {
  4. for (int j = 0; j < board[0].length; j++) {
  5. if (board[i][j] != '.'){//如果数字,跳过
  6. continue;
  7. }
  8. for (char k = '1';k <= '9'; k++){
  9. if (isValid(i, j, k, board)){//如果合法
  10. board[i][j] = k;//放置元素
  11. if (backtracking(board)) return true;// 如果找到合适一组立刻返回
  12. board[i][j] = '.';//回溯,撤回元素
  13. }
  14. }
  15. //找完还没找到
  16. return false;// 9个数都试完了,都不行,那么就返回false
  17. }
  18. }
  19. return true; // 遍历完没有返回false,说明找到了合适棋盘位置了
  20. }
  21. //合法性判断
  22. private boolean isValid(int row, int col, char val, char[][] board) {
  23. //判断行
  24. for (int i = 0; i < 9; i++) {
  25. if (board[row][i] == val){
  26. return false;
  27. }
  28. }
  29. //判断列
  30. for (int j = 0; j < 9; j++) {
  31. if (board[j][col] == val){
  32. return false;
  33. }
  34. }
  35. //判断九宫格内 这里两层for嵌套
  36. int startRow = (row / 3) * 3;
  37. int startCol = (col / 3) * 3;
  38. for (int i = startRow; i < startRow + 3; i++) { // 判断9方格里是否重复
  39. for (int j = startCol; j < startCol + 3; j++) {
  40. if (board[i][j] == val ) {
  41. return false;
  42. }
  43. }
  44. }
  45. return true;
  46. }
  47. public void solveSudoku(char[][] board) {
  48. backtracking(board);
  49. }
  50. }