-
Notifications
You must be signed in to change notification settings - Fork 35
/
Sudoku.java
174 lines (151 loc) · 4.22 KB
/
Sudoku.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
public class SudokuPuzzle
{
public boolean isSafe(int[][] b, int r, int c, int n)
{
// the loop takes care of the clash in the row of the grid
for (int d = 0; d < b.length; d++)
{
// if the number that we have inserted is already
// present in that row then return false
if (b[r][d] == n)
{
return false;
}
}
// the loop takes care of the clash in the column of the grid
for (int r1 = 0; r1 < b.length; r1++)
{
// if the number that we have inserted is already
// present in that column then return false
if (b[r1][c] == n)
{
return false;
}
}
// the loop takes care of the clash in the sub-grid that is present in the grid
int sqt = (int)Math.sqrt(b.length);
int boxRowSt = r - r % sqt;
int boxColSt = c - c % sqt;
for (int r1 = boxRowSt; r1 < boxRowSt + sqt; r1++)
{
for (int d = boxColSt; d < boxColSt + sqt; d++)
{
// if the number that we have inserted is already
// present in that sub-grid then return false
if (b[r1][d] == n)
{
return false;
}
}
}
// if there is no clash in the grid, then it is safe and
// true is returned
return true;
}
public boolean solveSudoku(int[][] b, int num)
{
int r = -1;
int c = -1;
boolean isVacant = true;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num; j++)
{
if (b[i][j] == 0)
{
r = i;
c = j;
// false value means
// there is still some
// vacant cells in the grid
isVacant = false;
break;
}
}
if (!isVacant)
{
break;
}
}
// there is no empty space left
// in the grid
if (isVacant)
{
return true;
}
// otherwise for each row do the backtracking
for (int no = 1; no <= num; no++)
{
if (isSafe(b, r, c, no))
{
b[r][c] = no;
if (solveSudoku(b, num))
{
// display(board, num);
return true;
}
else
{
b[r][c] = 0;
}
}
}
return false;
}
public void display(int[][] b, int n)
{
// We have got the solution, just display it
for (int i = 0; i < n; i++)
{
for (int d = 0; d < n; d++)
{
System.out.print(b[i][d]);
System.out.print(" ");
}
System.out.print("\n");
if ((i + 1) % (int)Math.sqrt(n) == 0)
{
System.out.print("");
}
}
}
// main method
public static void main(String argvs[])
{
// the 9 x 9 grid
int[][] b = new int[][] { { 7, 0, 0, 0, 0, 0, 2, 0, 0 },
{ 4, 0, 2, 0, 0, 0, 0, 0, 3 },
{ 0, 0, 0, 2, 0, 1, 0, 0, 0 },
{ 3, 0, 0, 1, 8, 0, 0, 9, 7 },
{ 0, 0, 9, 0, 7, 0, 6, 0, 0 },
{ 6, 5, 0, 0, 3, 2, 0, 0, 1 },
{ 0, 0, 0, 4, 0, 9, 0, 0, 0 },
{ 5, 0, 0, 0, 0, 0, 1, 0, 6 },
{ 0, 0, 6, 0, 0, 0, 0, 0, 8 }
} ;
// creating an object of the class SudokuPuzzle
SudokuPuzzle obj = new SudokuPuzzle();
// computing the size of the grid
int size = b.length;
System.out.println("The grid is: ");
for(int i = 0; i < size; i++)
{
for(int j = 0; j < size; j++)
{
System.out.print(b[i][j] + " ");
}
System.out.println();
}
System.out.println();
if (obj.solveSudoku(b, size))
{
// display solution
System.out.println("The solution of the grid is: ");
obj.display(b, size);
}
else
{
System.out.println("There is no solution available.");
}
}
}