package com.number; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Number { private int LINE = 9; public boolean done(int[] v) { for(int i=0; i<v.length; i++) { if (v[i] == 0) { List<Integer> ls = check(v, i); for(int j=0; j<ls.size(); j++) { int[] M = new int[v.length]; System.arraycopy(v, 0, M, 0, v.length); M[i] = ls.get(j); if (done(M)) { System.arraycopy(M, 0, v, 0, v.length); return true; }; } return false; } } return true; } private Integer[] DF = new Integer[] {1,2,3,4,5,6,7,8,9}; private List<Integer> check(int[] v, int pos) { List<Integer> value = new ArrayList<>(Arrays.asList(DF)); int n = LINE; int x = pos%n; int y = pos/n; //行 int m = y*n; for(int i=0;i<n;i++) { value.remove(new Integer(v[m+i])); } if (!value.isEmpty()) { //列 for(int i=0;i<n;i++) { value.remove(new Integer(v[i*n+x])); } if (!value.isEmpty()) { //宮格 x /= 3; y /= 3; for(int i=0;i<3; i++) { for(int j=0;j<3; j++) { value.remove(new Integer(v[(i+3*y)*n+x*3+j])); } } } } return value; } public void printf(int[] v) { int x = 0; int n = LINE; while (x*n<v.length) { for(int i=0;i<n;i++) { System.out.print(v[x*n+i]); if (i%3 == 2) { System.out.print(" "); } } System.out.println(); if (x%3 == 2) { System.out.println(); } x++; } } public static void main(String[] args) { int[] V = new int[] { 0,0,0, 0,0,0, 0,1,0, 5,8,9, 0,0,0, 7,0,0, 0,0,0, 0,0,0, 0,0,8, 7,6,0, 9,0,0, 0,0,0, 0,0,0, 0,8,0, 0,5,4, 0,0,3, 0,0,1, 0,0,0, 0,0,1, 0,0,0, 0,6,7, 0,0,0, 1,0,4, 0,0,0, 3,0,4, 0,0,6, 1,2,0, }; // int[] V = new int[] { // // 0,5,0, 0,0,0, 0,2,0, // 4,0,0, 2,0,6, 0,0,7, // 0,0,8, 0,3,0, 1,0,0, // // 0,1,0, 0,0,0, 0,6,0, // 0,0,9, 0,0,0, 5,0,0, // 0,7,0, 0,0,0, 0,9,0, // // 0,0,5, 0,8,0, 3,0,0, // 7,0,0, 9,0,1, 0,0,4, // 0,2,0, 0,0,0, 0,7,0, // }; Number number = new Number(); if (number.done(V)) { number.printf(V); } else { System.out.println("無結果"); }; } }