题解 | #Sudoku#
Sudoku
https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int[][] db = new int[10][10];//保存原始数据
List<int[]> arr = new ArrayList<>();//记录0元素的位置
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
db[i][j] = in.nextInt();
if ( db[i][j] == 0) {
arr.add(new int[] {i, j});
}
}
}
dfs(arr, db);
//打印
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
System.out.print(db[i][j] + " ");
}
System.out.println();
}
}
}
private static boolean dfs(List<int[]> arr, int[][] db) {
for (int j = 0; j < arr.size(); j++) {
int hang = arr.get(j)[0];
int lie = arr.get(j)[1];
//1-9去计算是否符合
for (int i = 1; i <= 9; i++) {
if (check(db, hang, lie, i)) {
db[hang][lie] = i;
List<int[]> temp = new ArrayList<>();
temp.addAll(arr);
temp.remove(j);
if (dfs(temp, db)) {
return true;
} else {
db[hang][lie] = 0;//回溯
}
}
}
return false;
}
return true;
}
//行,列,3*3判断
private static boolean check(int[][] db, int x, int y, int current) {
for (int i = 1; i <= 9; i++) {
//行
if (db[x][i] == current)return false;
//列
if (db[i][y] == current)return false;
}
//3*3 1 4
int hang = (x - 1) / 3 * 3 + 1; //3*3的起始行
int lie = (y - 1) / 3 * 3 + 1; //3*3的起始列
for (int i = hang; i < hang + 3; i++) {
for (int j = lie; j < lie + 3; j++) {
if (db[i][j] == current) {
return false;
}
}
}
return true;
}
}
查看22道真题和解析