一、题目
1、审题
2、分析
将所给的数独棋盘补充完整。
二、解答
1、思路:
利用上一题的判断数独是否正确。依次在数独棋盘中的空位补充‘1’ -‘9’,递归判断是否符合,若符合则继续下一个空位;若不符合,则空位还原。
1 public class Solution { 2 public void solveSudoku(char[][] board) { 3 helper(board); 4 } 5 6 private boolean helper(char[][] board) { 7 8 for(int row = 0; row < 9; row++) { 9 for(int col = 0; col < 9; col++) { 10 if(board[row][col] == '.') { 11 for(char i = '1'; i <= '9'; i++) { 12 board[row][col] = i; 13 if(isValidSudoku(board) && helper(board)) 14 return true; 15 // 还原 16 board[row][col] = '.'; 17 } 18 return false; 19 } 20 } 21 } 22 return true; 23 } 24 25 public boolean isValidSudoku(char[][] board) { 26 27 for(int i = 0; i < 9; i++) { 28 HashSet<Character> row = new HashSet<Character>(); 29 HashSet<Character> column = new HashSet<Character>(); 30 HashSet<Character> cube = new HashSet<Character>(); 31 32 for(int j = 0; j < 9; j++) { 33 34 if(board[i][j] != '.' && !row.add(board[i][j])) 35 return false; 36 37 if(board[j][i] != '.' && !column.add(board[j][i])) 38 return false; 39 40 int rowNum = i / 3 * 3 + j / 3; 41 int columnNum = i % 3 * 3 + j % 3; 42 if(board[rowNum][columnNum] != '.' && !cube.add(board[rowNum][columnNum])) 43 return false; 44 } 45 } 46 47 return true; 48 } 49 }