题目:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9b75518c8353479f8f382b0898937738.png)
思路:逐格填充→需要编写isValid函数来判断当前填的数字是否符合游戏规则
注意点🔣:
-
isValid函数不要忘了只检查横竖,还要检查整个九宫格
- 错误示范❌
public boolean isValid(int row, int col, char n, char[][] board) {
for (int i=0; i<9; ++i) {
if (i == row) {
continue;
} else if (board[i][col]==n) {
return false;
}
}
for (int i=0; i<9; ++i) {
if (i == col) {
continue;
} else if (board[row][i] == n) {
return false;
}
}
return true;
}
private boolean isValidSudoku(int row, int col, char val, char[][] board){
for (int i = 0; i < 9; i++){
if (board[row][i] == val){
return false;
}
}
for (int j = 0; j < 9; j++){
if (board[j][col] == val){
return false;
}
}
int startRow = (row / 3) * 3;
int startCol = (col / 3) * 3;
for (int i = startRow; i < startRow + 3; i++){
for (int j = startCol; j < startCol + 3; j++){
if (board[i][j] == val){
return false;
}
}
}
return true;
}
-
循环遍历时要填数字最方便的方式是for (char k = ‘1’; k <= ‘9’; k++)
public void solveSudoku(char[][] board) {
solveSudokuHelper(board);
}
private boolean solveSudokuHelper(char[][] board){
for (int i = 0; i < 9; i++){
for (int j = 0; j < 9; j++){
if (board[i][j] != '.'){
continue;
}
for (char k = '1'; k <= '9'; k++){
if (isValidSudoku(i, j, k, board)){
board[i][j] = k;
if (solveSudokuHelper(board)){
return true;
}
board[i][j] = '.';
}
}
return false;
}
}
return true;
}