leetcode 0037
说明
只是为了记录一下,不求多快,也不深究。
会简要描述思路,代码中不写注释。
如碰到不会做的用了别人代码会在博客中标出。
题目描述
参考
做法参考自B站up主:花花酱LeetCode的视频讲解,链接如下:
花花酱 LeetCode 37. Sudoku Solver - 刷题找工作 EP89
思路
能否填某数字要根据所在位置的行、列和33方格确定是否含有这个数字。
因此定义三个二维数组rowStatus、colStatus和boxStatus记录某一行某一列或某一方格中该数字是否已有。
然后一个格子一个格子的遍历,看下这个格子能填什么数,能填则填,填完后看新的数独是否有解,无解则回溯,试一下剩下的选择。
直至将数独填完。
class Solution {
public void solveSudoku(char[][] board) {
boolean[][] rowStatus = new boolean[9][9];
boolean[][] colStatus = new boolean[9][9];
boolean[][] boxStatus = new boolean[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.') {
continue;
}
int temp = board[i][j] - '0' - 1;
rowStatus[i][temp] = true;
colStatus[j][temp] = true;
boxStatus[(i / 3) * 3 + j / 3][temp] = true;
}
}
fillSudoku(board, 0, 0, rowStatus, colStatus, boxStatus);
}
public boolean fillSudoku(char[][] board, int col, int row, boolean[][] rowStatus, boolean[][] colStatus,
boolean[][] boxStatus) {
int nextCol = (col + 1) % 9;
int nextRow = nextCol == 0 ? row + 1 : row;
if (row == 9) {
return true;
}
if (board[row][col] != '.') {
return fillSudoku(board, nextCol, nextRow, rowStatus, colStatus, boxStatus);
}
for (int i = 1; i < 10; i++) {
if (rowStatus[row][i - 1] || colStatus[col][i - 1] || boxStatus[(row / 3) * 3 + col / 3][i - 1]) {
continue;
} else {
rowStatus[row][i - 1] = true;
colStatus[col][i - 1] = true;
boxStatus[(row / 3) * 3 + col / 3][i - 1] = true;
board[row][col] = (char) (i + 48);
if (fillSudoku(board, nextCol, nextRow, rowStatus, colStatus, boxStatus)) {
return true;
} else {
rowStatus[row][i - 1] = false;
colStatus[col][i - 1] = false;
boxStatus[(row / 3) * 3 + col / 3][i - 1] = false;
board[row][col] = '.';
}
}
}
return false;
}
}