题解 | #Sudoku#
Sudoku
https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
int[][] data = new int[9][9];
Scanner in = new Scanner(System.in);
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
data[i][j] = in.nextInt();
}
}
dfs(0, data);
}
public static void dfs(int pos, int[][] data) {
if (pos == 81) {
print(data);
System.exit(0);
}
int i = pos / 9;
int j = pos % 9;
if (data[i][j] == 0) {
for (int alt = 1; alt < 10; alt++) {
if (checkAlt(data, i, j, alt)) {
data[i][j] = alt;
dfs(pos + 1, data);
}
}
data[i][j] = 0; // 恢复现场
} else {
dfs(pos + 1, data);
}
}
public static boolean checkAlt(int[][] data, int i, int j, int alt) {
for (int k = 0; k < 9; k++) {
if (data[i][k] == alt) {
return false;
}
}
for (int k = 0; k < 9; k++) {
if (data[k][j] == alt) {
return false;
}
}
int row = i / 3 * 3;
int column = j / 3 * 3;
if (data[row][column] == alt ||
data[row][column + 1] == alt ||
data[row][column + 2] == alt ||
data[row + 1][column] == alt ||
data[row + 1][column + 1] == alt ||
data[row + 1][column + 2] == alt ||
data[row + 2][column] == alt ||
data[row + 2][column + 1] == alt ||
data[row + 2][column + 2] == alt) {
return false;
}
return true;
}
public static void print(int[][] data) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
System.out.print(data[i][j] + " ");
}
System.out.println();
}
}
}
将格子依次编号为0,1,2,...,80,
依次遍历每个格子pos,
int i = pos / 9
int j = pos % 9
如果格子的数值为0,则依次尝试填入1,2,3,4,5,6,7,8,9. 和第i行,第j列以及所在九宫格已有的数字不重复即可。
如果格子的数值不为0,则继续 dfs(pos+1,data)
如果pos达到了81,则说明所有格子里面的数值是符合要求的。
需要注意的是递归调用完成之后没有完成则需要恢复现场。
