다음 코드 스 니펫에 대한 질문이 있습니다. 빈 셀을 채워 스도쿠 퍼즐을 해결하는 스도쿠 솔버입니다. 솔버 메서드 뒤에 로직을 적용 할 수 없습니다. 왜 k = 1-9를 시도한 후 false를 반환하고 모든 셀을 루핑 한 후 true를 반환합니다. 필자가 우리가 재귀 적으로 solver() 메소드에 들어가고 스도쿠가 완료되면 true를 호출 순서로 반환하고 마지막으로 호출 된 첫 번째 solver()가 true를 반환 할 것이라고 생각했습니다. 나는 두 가지 이상의 "반환"이 일어나는 몇 가지 시나리오를 생략해야한다고 생각한다. 누군가 "돌아 오는"것이 존재해야하는 이유를 설명해 줄 수 있습니까?스도쿠 솔버의 코드 설명
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;
}
}
당신은 또한 마지막이 "true를 돌려"때 설명 할 수 일이? solver() 메소드의 마지막 줄. 감사. – shirley
에 도달 할 수있는 * 스도쿠 *가 완전히 풀 때, 즉 '.' – CapelliC