01.
public static void main(String[] args) {
02.
int[][] matrix = parseProblem(args);
03.
writeMatrix(matrix);
04.
if
(solve(0,0,matrix))
05.
writeMatrix(matrix);
06.
else
07.
System.out.println(
"NONE"
);
08.
}
09.
10.
static boolean solve(int i, int j, int[][] cells) {
11.
if
(i == 9) {
12.
i = 0;
13.
if
(++j == 9)
14.
return
true
;
15.
}
16.
if
(cells[i][j] != 0)
17.
return
solve(i+1,j,cells);
18.
19.
for
(int val = 1; val <= 9; ++val) {
20.
if
(legal(i,j,val,cells)) {
21.
cells[i][j] = val;
22.
if
(solve(i+1,j,cells))
23.
return
true
;
24.
}
25.
}
26.
cells[i][j] = 0;
27.
return
false
;
28.
}
29.
30.
static boolean legal(int i, int j, int val, int[][] cells) {
31.
for
(int k = 0; k < 9; ++k)
32.
if
(val == cells[k][j])
33.
return
false
;
34.
35.
for
(int k = 0; k < 9; ++k)
36.
if
(val == cells[i][k])
37.
return
false
;
38.
39.
int boxRowOffset = (i / 3)*3;
40.
int boxColOffset = (j / 3)*3;
41.
for
(int k = 0; k < 3; ++k)
42.
for
(int m = 0; m < 3; ++m)
43.
if
(val == cells[boxRowOffset+k][boxColOffset+m])
44.
return
false
;
45.
46.
return
true
;
47.
}
48.
49.
static int[][] parseProblem(String[] args) {
50.
int[][] problem =
new
int[9][9];
51.
for
(int n = 0; n < args.length; ++n) {
52.
int i = Integer.parseInt(args[n].substring(0,1));
53.
int j = Integer.parseInt(args[n].substring(1,2));
54.
int val = Integer.parseInt(args[n].substring(2,3));
55.
problem[i][j] = val;
56.
}
57.
return
problem;
58.
}
59.
60.
static void writeMatrix(int[][] solution) {
61.
for
(int i = 0; i < 9; ++i) {
62.
if
(i % 3 == 0)
63.
System.out.println(
" -----------------------"
);
64.
for
(int j = 0; j < 9; ++j) {
65.
if
(j % 3 == 0) System.out.print(
"| "
);
66.
System.out.print(solution[i][j] == 0
67.
?
" "
68.
: Integer.toString(solution[i][j]));
69.
70.
System.out.print(
' '
);
71.
}
72.
System.out.println(
"|"
);
73.
}
74.
System.out.println(
" -----------------------"
);
75.
}
76.
77.
}