-
Notifications
You must be signed in to change notification settings - Fork 0
/
SudokuSolver.java
executable file
·94 lines (80 loc) · 2.51 KB
/
SudokuSolver.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
public class SudokuSolver {
/**
* Controlla se il Sudoku è risolvibile
*
* @param SD Sudoku Grid
* @return se è risolvibe o no
*/
static boolean isSolvable(SudokuGrid SD){
int un[] = Unasigned(SD);
SudokuGrid SDtmp = new SudokuGrid(-1, SD.getDifficulty(), SD.getN(), 'T');
SDtmp.resetGrid();
for(int row = 0; row < SD.getN(); row++){
for(int col = 0; col < SD.getN(); col++){
SDtmp.getCells()[row][col].setValue(SD.getCells()[row][col].getValue());
}
}
return solve(SDtmp, un[0], un[1]);
}
static boolean solve(SudokuGrid SD){
int un[] = Unasigned(SD);
if(un[0] == -1 || un[1] == -1) return true;
return solve(SD, un[0], un[1]);
}
/**
* Risolve il Sudoku
*
* @param SD SudokuGrid
* @param i posizione x
* @param j posizione y
* @return se la cella inserita è valida
*/
static boolean solve(SudokuGrid SD, int i, int j){
for(int num = 1; num <= SD.getN(); num++){
if(SudokuValidator.isSafe(i, j, num, SD)){
SD.getCells()[i][j].setValue(num);
int un[] = Unasigned(SD);
if(un[0] == -1 || un[1] == -1) return true;
if(solve(SD, un[0], un[1]))
return true;
SD.getCells()[i][j].setValue(-1);
}
}
return false;
}
/**
* Ritorna la prima cella libera
*
* @param SD SudokuGrid
* @return un array con la riga e la colonna
*/
static int[] Unasigned(SudokuGrid SD){
int res[] = new int[2];
res[0] = -1;
res[1] = -1;
for(int row = 0; row < SD.getN(); row++){
for(int col = 0; col < SD.getN(); col++){
if(SD.getCells()[row][col].getValue() == -1){
res[0] = row;
res[1] = col;
return res;
}
}
}
return res;
}
/**
* Controlla se la Grid è valida
*
* @param SD Sudoku Grid
* @return se la grid è valida
*/
static boolean isGridValid(SudokuGrid SD){
for(int row = 0; row < SD.getN(); row++){
for(int col = 0; col < SD.getN(); col++){
if(!SudokuValidator.isSafe2(row, col, SD.getCells()[row][col].getValue(), SD) || SD.getCells()[row][col].getValue() == -1) return false;
}
}
return true;
}
}