用recursion, 遇到非'.'跳过,遇到'.' 就从 ‘1’ 到'9' 每个数字做一次DFS
需要一个helper function来检验当前sukdoku是否有效
public class Solution { public void solveSudoku(char[][] board) { solveSudokuHelper(board, 0, 0); } public boolean solveSudokuHelper(char[][] board, int startI, int startJ){ if (startI == board.length){ return true; } if (startJ == board[0].length){ return solveSudokuHelper(board, startI+1, 0); } if (board[startI][startJ] != '.'){ return solveSudokuHelper(board, startI, startJ+1); } for (char temp = '1'; temp <= '9'; temp++){ board[startI][startJ] = temp; if (isValidSudoku(board, startI, startJ) && solveSudokuHelper(board, startI, startJ+1)){ return true; } } board[startI][startJ] = '.'; return false; } public boolean isValidSudoku(char[][] board, int i, int j) { for (int checkRow = 0; checkRow < board[0].length; checkRow++){ if (checkRow != j && board[i][checkRow] == board[i][j]){ return false; } } for (int checkColumn = 0; checkColumn < board.length; checkColumn++){ if (checkColumn != i && board[checkColumn][j] == board[i][j]){ return false; } } int boxRow = (i/3)*3; int boxColumn = (j/3)*3; for (int k = boxRow; k < boxRow+3; k++){ for (int q = boxColumn; q < boxColumn+3; q++){ if (k != i && q != j && board[k][q] == board[i][j]){ return false; } } } return true; } }
No comments:
Post a Comment