public class NumberDegrees { private final static int N = 3; public static void main(String[] args) { int x[][]={ {0,2,0,0,0,9,0,1,0,0}, {5,0,6,0,0,0,3,0,9,0}, {0,8,0,5,0,2,0,6,0,0}, {0,0,5,0,7,0,1,0,0,0}, {0,0,0,2,0,8,0,0,0,0}, {0,0,4,0,1,0,8,0,0,0}, {0,5,0,8,0,7,0,3,0,0}, {7,0,2,3,0,0,4,0,5,0}, {0,4,0,0,0,0,0,7,0,0}, }; NumberDegrees number = new NumberDegrees(); number.function(x,0,0); } public void function(int[][] x, int r, int c) { //1.判断行数,如果是第九行或者大与9行的话直接输出数独 if (r >= x.length) { show(x); return; } //2.判断如果是3,6,9行的话判断前面的几行是否有重复数字 if (c == 0 && (r == x.length / 3 || r == x.length / 3 * 2 || r == x.length)) { if(!checkBox(x, r)) { return; } } //3.判断是否是一行的最后一列,如果是,则跳转到下一行 if (c >= x.length) { function(x, r + 1, 0); return; } //4.判断是否是需要填的数字,如果是则填写正确的数字,如果不是则填写下一个 if (x[r][c] == 0) { for (int i = 1; i <= x.length; i++) { if(checked(x, r, c, i)) { x[r][c] = i; function(x, r, c + 1); x[r][c] = 0; } } } else { function(x, r, c + 1); } } /** * 判断这列这行的是否有数字与之相等 * @param x * @param r * @param c * @param i * @return */ public boolean checked(int[][] x, int r, int c, int i) { for (int j = 0; j < x.length; j++) { if(x[r][j] == i) { return false; } if (x[j][c] == i) { return false; } } return true; } /** * 判断前几行是否有重复的数字 * @param x * @param r * @return */ public boolean checkBox(int [][] x, int r) { for (int k = 0; k < x.length; k += x.length / N) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int i = r - N; i < r; i++) { for (int j = k; j < k + x.length / N; j++) { if (map.containsKey(x[i][j])) { return false; } map.put(x[i][j], 1); } } } return true; } public void show(int[][] x) { for (int i = 0; i < x.length; i++) { for (int j = 0; j < x.length; j++) { System.out.print(x[i][j] + " "); } System.out.println(); } System.out.println(); } }
时间: 2024-11-13 07:56:42