Tôi có câu hỏi về đoạn mã sau: Đó là trình giải Sudoku giải quyết câu đố Sudoku bằng cách điền vào các ô trống. Tôi thực sự không thể có được logic đằng sau phương pháp giải quyết. Tại sao nó trả về false sau khi thử k = 1-9 và trả về true sau khi lặp qua tất cả các ô. Những gì tôi nghĩ là chúng ta đệ quy vào phương thức solver() và một khi sudoku được thực hiện, nó sẽ trả về true theo thứ tự gọi và cuối cùng là trình giải mã được gọi đầu tiên() sẽ trả về true. Tôi nghĩ rằng tôi phải bỏ qua một số kịch bản mà trên hai "trở lại" xảy ra. Ai đó có thể giải thích cho tôi tại sao những "trở lại" đó tồn tại?Mã giải thích về Sudoku Solver
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
char[][] board = {{'.', '2', '6', '5', '.', '.', '.', '9', '.'},
{'5', '.', '.', '.', '7', '9', '.', '.', '4'},
{'3', '.', '.', '.', '1', '.', '.', '.', '.'},
{'6', '.', '.', '.', '.', '.', '8', '.', '7'},
{'.', '7', '5', '.', '2', '.', '.', '1', '.'},
{'.', '1', '.', '.', '.', '.', '4', '.', '.'},
{'.', '.', '.', '3', '.', '8', '9', '.', '2'},
{'7', '.', '.', '.', '6', '.', '.', '4', '.'},
{'.', '3', '.', '2', '.', '.', '1', '.', '.'}};
s.solver(board);
}
public boolean solver(char[][] board) {
for (int r = 0; r < board.length; r++) {
for (int c = 0; c < board[0].length; c++) {
if (board[r][c] == '.') {
for (int k = 1; k <= 9; k++) {
board[r][c] = (char) ('0' + k);
if (isValid(board, r, c) && solver(board)) {
return true;
} else {
board[r][c] = '.';
}
}
return false;
}
}
}
return true;
}
public boolean isValid(char[][] board, int r, int c) {
//check row
boolean[] row = new boolean[9];
for (int i = 0; i < 9; i++) {
if (board[r][i] >= '1' && board[r][i] <= '9') {
if (row[board[r][i] - '1'] == false) {
row[board[r][i] - '1'] = true;
} else {
return false;
}
}
}
//check column
boolean[] col = new boolean[9];
for (int i = 0; i < 9; i++) {
if (board[i][c] >= '1' && board[i][c] <= '9') {
if (col[board[i][c] - '1'] == false) {
col[board[i][c] - '1'] = true;
} else {
return false;
}
}
}
//check the 3*3 grid
boolean[] grid = new boolean[9];
for (int i = (r/3) * 3; i < (r/3) * 3 + 3; i++) {
for (int j = (c/3) * 3; j < (c/3) * 3 + 3; j++) {
if (board[i][j] >= '1' && board[i][j] <= '9') {
if (grid[board[i][j] - '1'] == false) {
grid[board[i][j] - '1'] = true;
} else {
return false;
}
}
}
}
return true;
}
}
thể bạn cũng giải thích khi nào trận chung kết "return true" xảy ra? Dòng cuối cùng trong phương thức solver(). Cảm ơn. – shirley
chỉ có thể đạt * * khi sudoku nếu * hoàn toàn * được giải quyết, tức là cuộc gọi đầu tiên không tìm thấy bất kỳ '.' – CapelliC