1
+ public class Sudoku {
2
+
3
+ public final int SUDOKU_SIZE = 9 ;
4
+ public final int UNASSIGNED = 0 ;
5
+
6
+
7
+ private int unassignedPositionRow ;
8
+ private int unassignedPositionColumn ;
9
+ private int [][] matrix = new int [SUDOKU_SIZE ][SUDOKU_SIZE ];
10
+
11
+ public Sudoku () {
12
+
13
+ clear ();
14
+ }
15
+
16
+ public void clear () {
17
+ for (int i = 0 ; i < SUDOKU_SIZE ; i ++)
18
+ for (int j = 0 ; j < SUDOKU_SIZE ; j ++)
19
+ matrix [i ][j ] = UNASSIGNED ;
20
+ }
21
+
22
+ public void insertRandomNumbers (int n ) {
23
+
24
+ for (int i = 0 ; i < n ; i ++) {
25
+ int randomRow = (int )(Math .random () * (SUDOKU_SIZE - 1 ));
26
+ int randomColumn = (int )(Math .random () * (SUDOKU_SIZE - 1 ));
27
+ int randomNumber = (int )(Math .random () * (SUDOKU_SIZE - 1 ) + 1 );
28
+ matrix [randomRow ][randomColumn ] = randomNumber ;
29
+ }
30
+ }
31
+
32
+ public boolean solve () {
33
+
34
+ if (!findUnassignedPosition ())
35
+ return true ;
36
+
37
+ for (int n = 1 ; n <= SUDOKU_SIZE ; n ++) {
38
+
39
+ if (canBePlaced (unassignedPositionRow , unassignedPositionColumn , n )) {
40
+ final int i = unassignedPositionRow ;
41
+ final int j = unassignedPositionColumn ;
42
+ matrix [i ][j ] = n ;
43
+
44
+ if (solve ())
45
+ return true ;
46
+
47
+ matrix [i ][j ] = UNASSIGNED ;
48
+ }
49
+ }
50
+
51
+ return false ;
52
+ }
53
+
54
+ private boolean findUnassignedPosition () {
55
+
56
+ for (int i = 0 ; i < SUDOKU_SIZE ; i ++) {
57
+ for (int j = 0 ; j < SUDOKU_SIZE ; j ++) {
58
+ if (matrix [i ][j ] == UNASSIGNED ) {
59
+ unassignedPositionRow = i ;
60
+ unassignedPositionColumn = j ;
61
+ return true ;
62
+ }
63
+ }
64
+ }
65
+
66
+ return false ;
67
+ }
68
+
69
+ private boolean canBePlaced (int row , int column , int number ) {
70
+
71
+ return !isUsedInRow (row , number ) && !isUsedInColumn (column , number ) && !isUsedInBox (row , column , number );
72
+ }
73
+
74
+ private boolean isUsedInRow (int row , int number ) {
75
+
76
+ for (int i = 0 ; i < SUDOKU_SIZE ; i ++)
77
+ if (matrix [row ][i ] == number )
78
+ return true ;
79
+ return false ;
80
+ }
81
+
82
+ private boolean isUsedInColumn (int column , int number ) {
83
+
84
+ for (int i = 0 ; i < SUDOKU_SIZE ; i ++)
85
+ if (matrix [i ][column ] == number )
86
+ return true ;
87
+ return false ;
88
+ }
89
+
90
+ private boolean isUsedInBox (int row , int column , int number ) {
91
+
92
+ int startRow = row - row % 3 ;
93
+ int startColumn = column - column % 3 ;
94
+
95
+ for (int i = 0 ; i < 3 ; i ++)
96
+ for (int j = 0 ; j < 3 ; j ++)
97
+ if (matrix [startRow + i ][startColumn + j ] == number )
98
+ return true ;
99
+ return false ;
100
+ }
101
+
102
+ public void print () {
103
+ System .out .println ("-------------------------" );
104
+
105
+ for (int i = 0 ; i < SUDOKU_SIZE ; i ++) {
106
+ for (int j = 0 ; j < SUDOKU_SIZE ; j ++) {
107
+ if (j == 0 )
108
+ System .out .print ("| " );
109
+ System .out .print (matrix [i ][j ] + " " );
110
+ if (j % 3 == 2 )
111
+ System .out .print ("| " );
112
+
113
+ }
114
+ System .out .println ();
115
+ if (i % 3 == 2 )
116
+ System .out .println ("-------------------------" );
117
+ }
118
+
119
+ }
120
+
121
+ public static void main (String [] args ) {
122
+
123
+ Sudoku sudoku = new Sudoku ();
124
+ sudoku .insertRandomNumbers (3 );
125
+ System .out .println ("Current sudoku state:" );
126
+ sudoku .print ();
127
+ System .out .println ("Solving..." );
128
+ if (sudoku .solve ())
129
+ sudoku .print ();
130
+ else
131
+ System .out .println ("No solution found! :(" );
132
+ }
133
+ }
0 commit comments