数独是一个非常有名的游戏。整个是一个9X9的大宫格,其中又被划分成9个3X3的小宫格。要求在每个小格中放入1-9中的某个数字。要求是:每行、每列、每个小宫格中数字不能重复。 现要求用计算机求解数独。
import java.io.*;
public class Main {
public static void main(String[] args) throws FileNotFoundException {
shudu();
}
public static void shudu() throws FileNotFoundException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[][] arrs = new int[9][9];
for (int i = 0; i < 9; i++) {
// String strs = sc.nextLine();
String strs = "";
try {
strs = br.readLine();
} catch (Exception e) {
e.printStackTrace();
}
String[] arr = strs.split(" ");
for (int j = 0; j < 9; j++) {
arrs[i][j] = Integer.parseInt(arr[j]);
}
}
boolean result = locationNumber(arrs, 0, 0);
if (result)
printArrs(arrs);
}
public static void printArrs(int[][] arrs) {
for (int i = 0; i < arrs.length; i++) {
for (int j = 0; j < arrs[0].length - 1; j++) {
System.out.print(arrs[i][j] + " ");
}
System.out.println(arrs[i][arrs[0].length - 1]);
}
}
//定位一个数字的位置,先找出这个位置可能的数字,取其中一种可能进行扫描。
//如果能够一直扫描到最后一个数字都可以说明这个是对的。
public static boolean locationNumber(int[][] arrs, int i, int j) {
if (i == 8 && j == 9) {
return true;
}
if (j == 9) {
i++;
j = 0;
}
boolean result = false;
if (arrs[i][j] == 0) {
boolean[] temp = possibleNumber(arrs, i, j);
for (int k = 1; k < 10; k++) {
if (!result && !temp[k]) {
arrs[i][j] = k;
result = locationNumber(arrs, i, j);
}
if (!result) {
arrs[i][j] = 0;
}
}
} else {
result = locationNumber(arrs, i, j + 1);
}
return result;
}
//返回可能的number列表
public static boolean[] possibleNumber(int[][] arrs, int i, int j) {
boolean[] temp = new boolean[10];
if (arrs[i][j] == 0) {
for (int k = 0; k < 9; k++) {
temp[arrs[i][k]] = true;
temp[arrs[k][j]] = true;
}
int line = i / 3 * 3;
int row = j / 3 * 3;
for (int k = line; k < line + 3; k++) {
for (int l = row; l < row + 3; l++) {
temp[arrs[k][l]] = true;
}
}
}
//检测规则 横 竖 9宫格 不能相同
return temp;
}
}