Skip to content

Commit 13fb627

Browse files
Add sudoku algorithm in Java
1 parent 41276ed commit 13fb627

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
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

Comments
 (0)