sudoku válido
tema
Dado un Sudoku representado por una matriz bidimensional, determine si el Sudoku es un
vínculo válido.
tren de pensamiento
Utilice tres matrices booleanas bidimensionales para indicar si el número j aparece en la i-ésima fila, i-ésima columna y i-ésima cuadrícula de nueve cuadrados. Si un determinado número aparece repetidamente en una determinada fila, columna o nueve -cuadrícula, no hay solución para el Sudoku; recorrido exitoso Todas las cuadrículas tienen soluciones
class ValidSudoku {
// 二维数组[i][j]表示第i行、列、九宫格中j数是否出现
public static boolean isValidSudoku(char[][] board) {
boolean[][] row = new boolean[9][10]; // 0位置不使用
boolean[][] col = new boolean[9][10];
boolean[][] bucket = new boolean[9][10]; // bucket表示九宫格
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
// 求九宫格号
int bid = 3 * (i / 3) + (j / 3);
if (board[i][j] != '.') {
int num = board[i][j] - '0';
if (row[i][num] || col[j][num] || bucket[bid][num]) {
return false;
}
row[i][num] = true;
col[j][num] = true;
bucket[bid][num] = true;
}
}
}
return true;
}
}
solución única para sudoku
tema
Dado un Sudoku representado por una matriz bidimensional, devuelve la solución del Sudoku. El título garantiza que el Sudoku tiene un
enlace de solución único.
tren de pensamiento
Igual que la pregunta anterior, use tres matrices bidimensionales para registrar si el número j aparece en la i-ésima fila, i-ésima columna y i-ésima cuadrícula de nueve cuadrados, y luego recorra las cuadrículas una por una, intente nueve números del 1 al 9 en cada cuadrícula por turno, y obtenga la solución única transversal
class SudokuSolver {
public static void solveSudoku(char[][] board) {
boolean[][] row = new boolean[9][10]; // 0位置不使用,表示第i行j数字是否出现
boolean[][] col = new boolean[9][10]; // 表示第i列j数字是否出现
boolean[][] bucket = new boolean[9][10]; // 表示第i个九宫格j数字是否出现
initMaps(board, row, col, bucket);
process(board, 0, 0, row, col, bucket);
}
public static void initMaps(char[][] board, boolean[][] row, boolean[][] col, boolean[][] bucket) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
// 求九宫格号
int bid = 3 * (i / 3) + (j / 3);
if (board[i][j] != '.') {
int num = board[i][j] - '0';
row[i][num] = true;
col[j][num] = true;
bucket[bid][num] = true;
}
}
}
}
public static boolean process(char[][] board, int i, int j, boolean[][] row, boolean[][] col, boolean[][] bucket) {
if (i == 9) {
// 到达终止位置
return true;
}
// 跳到下一个位置
int nexti = j != 8 ? i : i + 1;
int nextj = j != 8 ? j + 1 : 0;
if (board[i][j] != '.') {
return process(board, nexti, nextj, row, col, bucket);
} else {
int bid = 3 * (i / 3) + (j / 3);
for (int num = 1; num <= 9; num++) {
// 检验行、列、九宫格是否有重复数字
if (!row[i][num] && !col[j][num] && !bucket[bid][num]) {
row[i][num] = true;
col[j][num] = true;
bucket[bid][num] = true;
board[i][j] = (char) (num + '0');
if (process(board, nexti, nextj, row, col, bucket)) {
return true;
}
// 若尝试失败,则恢复现场
row[i][num] = false;
col[j][num] = false;
bucket[bid][num] = false;
board[i][j] = '.';
}
}
return false;
}
}
}