数独解题算法java版
import java.util.Arrays;
/**
* @Author: panlf
* @Date: 2019/9/20 14:15
*/
public class Sudok {
public static void main(String[] args) {
insertNum(0,0,getArr());
}
private static void insertNum(int i, int j, Integer[][] arr) {
//如果i超过8了,说明填满了,直接打印就行了
if(i>8){
Arrays.asList(arr).forEach(x-> System.out.println(Arrays.asList(x)));
return;
}
//如果这个地方有值了,直接跳过,填下一个
if(arr[i][j]!=0){
insertNum(j==8?i+1:i,(j+1)%9,arr);
return;
}
//遍历1-9去尝试填这个格子
for (int k = 1; k <= 9; k++) {
if(check(i,j,k,arr)){
arr[i][j]=k;
insertNum(j==8?i+1:i,(j+1)%9,arr);
//运行到这里说明上一步尝试失败了,需要把刚刚填的清除为0
arr[i][j]=0;
}
}
}
private static boolean check(int i, int j, int k, Integer[][] arr) {
//橫,竖,9宫格 分别校验
for (int l = 0; l < 9; l++)
if(arr[i][l]==k || arr[l][j]==k || arr[(i/3)*3+l/3][(j/3)*3+l%3]==k)return false;
return true;
}
//初始化数组
private static Integer[][] getArr() {
Integer[][] result = new Integer[9][9];
result[0] = new Integer[]{7, 3, 0, 2, 1, 8, 5, 0, 4};
result[1] = new Integer[]{2, 1, 0, 0, 0, 9, 0, 0, 3};
result[2] = new Integer[]{5, 9, 0, 0, 7, 0, 2, 8, 1};
result[3] = new Integer[]{3, 4, 1, 8, 6, 0, 9, 2, 7};
result[4] = new Integer[]{0, 6, 0, 0, 9, 0, 0, 1, 0};
result[5] = new Integer[]{9, 5, 2, 0, 4, 1, 8, 3, 6};
result[6] = new Integer[]{4, 7, 3, 0, 8, 0, 0, 5, 2};
result[7] = new Integer[]{6, 0, 0, 1, 0, 0, 0, 4, 9};
result[8] = new Integer[]{1, 0, 9, 5, 3, 4, 0, 6, 8};
return result;
}
}