LeetCode: Sudoku Solver

不念不忘少年蓝@ 2022-08-07 02:48 123阅读 0赞
  1. public void solveSudoku(char[][] board) {
  2. fillSudoku(board, 0);
  3. }
  4. /**
  5. * 填写数独中缺失数字,数独中缺失数字用'.'表示
  6. * @param board--数独
  7. * @param n--已经填写的格子数
  8. */
  9. public boolean fillSudoku(char[][] board, int n) {
  10. if(n == 81)
  11. return true;
  12. int r = n % 9; //行
  13. int c = n / 9; //列
  14. boolean flag = false;
  15. if(board[r][c] != '.') {
  16. flag = fillSudoku(board, n+1);
  17. } else {
  18. for(int i=1; i<10; i++) {
  19. if(validFill(board, r, c, i)) {
  20. board[r][c] = (char)(i + '0');
  21. flag = fillSudoku(board, n+1);
  22. if(flag) {
  23. break;
  24. }
  25. board[r][c] = '.'; //回溯
  26. }
  27. }
  28. }
  29. return flag;
  30. }
  31. /**
  32. * 验证填的数字是否有效:每行,每列,每个九宫格不能出现两个以上同样的数
  33. * @param board -- 数独矩阵
  34. * @param r -- 行
  35. * @param c -- 列
  36. * @param d -- 要填入的数字
  37. * @return
  38. */
  39. public boolean validFill(char[][] board, int r, int c, int d) {
  40. char temp = (char)(d + '0');
  41. for(int i=0; i<9; i++) {
  42. //验证第r行和第c列是否存在与d相同的元素
  43. if(board[r][i] == temp || board[i][c] == temp) {
  44. return false;
  45. }
  46. }
  47. //验证(r,c)对应的九宫格中是否存在与d相同的元素
  48. int sr = r / 3; //按行判断九宫格位置
  49. int sc = c / 3; //按列判断九宫格位置
  50. for(int i=3*sr; i<3*(sr+1); i++) {
  51. for(int j=3*sc; j<3*(sc+1); j++) {
  52. if(board[i][j] == temp) {
  53. return false;
  54. }
  55. }
  56. }
  57. return true;
  58. }

发表评论

表情:
评论列表 (有 0 条评论,123人围观)

还没有评论,来说两句吧...

相关阅读