一道比较难的题
关键点
- for (char a = ‘1’; a < ‘9’; a++)
- 二重递归
- backtracking返回boolean
- 在’1’-'9’都没有合适位置后,此轮便是无解,可以退出进行下一轮递归
- 之所以返回boolean,是为了最后结果不会因为回溯返回重新变为’.',提前return可以保留数字
PS:理解还不是很透彻,后续还要再看一遍
package algorithm;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SolveSudoku {
static List<String> res = new ArrayList<>();
public static void main(String[] args) {
solveSudoku();
}
private static void solveSudoku() {
String[][] input = {
{"5", "3", ".", ".", "7", ".", ".", ".", "."},
{"6", ".", ".", "1", "9", "5", ".", ".", "."},
{".", "9", "8", ".", ".", ".", ".", "6", "."},
{"8", ".", ".", ".", "6", ".", ".", ".", "3"},
{"4", ".", ".", "8", ".", "3", ".", ".", "1"},
{"7", ".", ".", ".", "2", ".", ".", ".", "6"},
{".", "6", ".", ".", ".", ".", "2", "8", "."},
{".", ".", ".", "4", "1", "9", ".", ".", "5"},
{".", ".", ".", ".", "8", ".", ".", "7", "9"}
};
char[][] sudokuArray = createCharArray(input);
backtracking(sudokuArray);
printSudokuArray(sudokuArray);
}
private static boolean backtracking(char[][] board) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (board[i][j] == '.') {
for (char c = '1'; c <= '9'; c++) {
if (isValid(board, i, j, c)) {
board[i][j] = c;
if (backtracking(board)) {
return true;
}
board[i][j] = '.';
}
}
// 关键点(如果1-9都不满足,就返回false, **如果成功了就不会走到这里)
return false;
}
}
}
return true;
}
private static boolean isValid(char[][] board, int row, int col, char ch) {
for (int i = 0; i < 9; i++) {
if (board[i][col] == ch) {
return false;
}
}
for (int i = 0; i < 9; i++) {
if (board[row][i] == ch) {
return false;
}
}
row = row / 3 * 3;
col = col / 3 * 3;
for (int i = row; i < row + 3; i++) {
for (int j = col; j < col + 3; j++)
if (board[i][j] == ch) {
return false;
}
}
return true;
}
private static char[][] createCharArray(String[][] input) {
char[][] result = new char[input.length][input[0].length];
for (int i = 0; i < input.length; i++) {
for (int j = 0; j < input[i].length; j++) {
result[i][j] = input[i][j].charAt(0);
}
}
return result;
}
private static void printSudokuArray(char[][] array) {
for (char[] row : array) {
System.out.println(Arrays.toString(row));
}
}
}