New interface
This commit is contained in:
parent
ec37568e38
commit
0277a1f8b6
3 changed files with 61 additions and 29 deletions
|
@ -24,7 +24,7 @@ public class Solver implements SudokuSolver {
|
||||||
/**
|
/**
|
||||||
* Resets the board to all zeros
|
* Resets the board to all zeros
|
||||||
*/
|
*/
|
||||||
public void reset() {
|
public void clear() {
|
||||||
board = new int[9][9];
|
board = new int[9][9];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ public class Solver implements SudokuSolver {
|
||||||
|
|
||||||
// Check for legal values in the current cell
|
// Check for legal values in the current cell
|
||||||
for (int val = 1; val <= 9; ++val) {
|
for (int val = 1; val <= 9; ++val) {
|
||||||
if (legal(row, col, val)) {
|
if (isLegal(row, col, val)) {
|
||||||
board[row][col] = val;
|
board[row][col] = val;
|
||||||
// When we find a legal value, recursively call solve() on the next cell
|
// When we find a legal value, recursively call solve() on the next cell
|
||||||
if (solve(row + 1, col)) {
|
if (solve(row + 1, col)) {
|
||||||
|
@ -80,25 +80,21 @@ public class Solver implements SudokuSolver {
|
||||||
* Randomizes the board. This guarantees a solvable board.
|
* Randomizes the board. This guarantees a solvable board.
|
||||||
*/
|
*/
|
||||||
public void randomizeBoard() {
|
public void randomizeBoard() {
|
||||||
this.reset();
|
this.clear();
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
int row = (int) (Math.random() * 9);
|
int row = (int) (Math.random() * 9);
|
||||||
int col = (int) (Math.random() * 9);
|
int col = (int) (Math.random() * 9);
|
||||||
int val = (int) (Math.random() * 9) + 1;
|
int val = (int) (Math.random() * 9) + 1;
|
||||||
if (legal(row, col, val)) {
|
if (isLegal(row, col, val)) {
|
||||||
board[row][col] = val;
|
board[row][col] = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the value of the board at the given position
|
* {@inheritDoc}
|
||||||
*
|
|
||||||
* @param row row to set
|
|
||||||
* @param col column to set
|
|
||||||
* @param val value to set
|
|
||||||
*/
|
*/
|
||||||
public void setPos(int row, int col, int val) {
|
public void set(int row, int col, int val) {
|
||||||
if (row < 9 && col < 9) {
|
if (row < 9 && col < 9) {
|
||||||
board[row][col] = val;
|
board[row][col] = val;
|
||||||
}
|
}
|
||||||
|
@ -107,7 +103,17 @@ public class Solver implements SudokuSolver {
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public boolean legal(int row, int col, int val) {
|
public int get(int row, int col) {
|
||||||
|
if (row < 9 && col < 9) {
|
||||||
|
return board[row][col];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public boolean isLegal(int row, int col, int val) {
|
||||||
if (row < 0 || row >= 9 || col < 0 || col >= 9 || val < 1 || val > 9) {
|
if (row < 0 || row >= 9 || col < 0 || col >= 9 || val < 1 || val > 9) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,14 @@ package sudoku;
|
||||||
public interface SudokuSolver {
|
public interface SudokuSolver {
|
||||||
/**
|
/**
|
||||||
* Set sudoku board, numbers 1-9 are fixed values, 0 is unsolved.
|
* Set sudoku board, numbers 1-9 are fixed values, 0 is unsolved.
|
||||||
|
*
|
||||||
|
* @param board a board to copy values from
|
||||||
|
* @throws IllegalArgumentException if board is invalid, e.g. not 9x9
|
||||||
*/
|
*/
|
||||||
void setBoard(int[][] board);
|
void setBoard(int[][] board);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the sudoku board
|
* Get a copy of the sudoku board
|
||||||
*/
|
*/
|
||||||
int[][] getBoard();
|
int[][] getBoard();
|
||||||
|
|
||||||
|
@ -26,5 +29,28 @@ public interface SudokuSolver {
|
||||||
* @param nbr
|
* @param nbr
|
||||||
* @return true if legal
|
* @return true if legal
|
||||||
*/
|
*/
|
||||||
boolean legal(int row, int col, int nbr);
|
boolean isLegal(int row, int col, int nbr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get number on board
|
||||||
|
*
|
||||||
|
* @param row
|
||||||
|
* @param col
|
||||||
|
* @return number on board
|
||||||
|
*/
|
||||||
|
int get(int row, int col);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set number on board, numbers 1-9 are fixed values, 0 is unsolved.
|
||||||
|
*
|
||||||
|
* @param row
|
||||||
|
* @param col
|
||||||
|
* @param nbr
|
||||||
|
*/
|
||||||
|
void set(int row, int col, int nbr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the board
|
||||||
|
*/
|
||||||
|
void clear();
|
||||||
}
|
}
|
|
@ -31,17 +31,17 @@ class SolverTest {
|
||||||
@Test
|
@Test
|
||||||
void legalTest() {
|
void legalTest() {
|
||||||
Solver solver = new Solver();
|
Solver solver = new Solver();
|
||||||
assertTrue(solver.legal(0, 0, 1));
|
assertTrue(solver.isLegal(0, 0, 1));
|
||||||
solver.setPos(0, 0, 1);
|
solver.set(0, 0, 1);
|
||||||
|
|
||||||
IntStream.range(0, 9).forEach(i -> {
|
IntStream.range(0, 9).forEach(i -> {
|
||||||
assertFalse(solver.legal(0, i, 1));
|
assertFalse(solver.isLegal(0, i, 1));
|
||||||
assertFalse(solver.legal(i, 0, 1));
|
assertFalse(solver.isLegal(i, 0, 1));
|
||||||
});
|
});
|
||||||
|
|
||||||
assertTrue(solver.legal(5, 5, 1));
|
assertTrue(solver.isLegal(5, 5, 1));
|
||||||
assertTrue(solver.legal(8, 8, 9));
|
assertTrue(solver.isLegal(8, 8, 9));
|
||||||
assertTrue(solver.legal(8, 8, 1));
|
assertTrue(solver.isLegal(8, 8, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -51,7 +51,7 @@ class SolverTest {
|
||||||
assertTrue(solver.solve());
|
assertTrue(solver.solve());
|
||||||
assertTrue(solver.isSolved());
|
assertTrue(solver.isSolved());
|
||||||
|
|
||||||
solver.reset();
|
solver.clear();
|
||||||
solver.randomizeBoard();
|
solver.randomizeBoard();
|
||||||
assertFalse(solver.isSolved());
|
assertFalse(solver.isSolved());
|
||||||
assertTrue(solver.solve());
|
assertTrue(solver.solve());
|
||||||
|
@ -62,25 +62,25 @@ class SolverTest {
|
||||||
Solver solver = new Solver();
|
Solver solver = new Solver();
|
||||||
assertTrue(solver.solve());
|
assertTrue(solver.solve());
|
||||||
solver.randomizeBoard();
|
solver.randomizeBoard();
|
||||||
solver.reset();
|
solver.clear();
|
||||||
assertFalse(solver.isSolved());
|
assertFalse(solver.isSolved());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void legalWithInvalidInputsTest() {
|
void legalWithInvalidInputsTest() {
|
||||||
Solver solver = new Solver();
|
Solver solver = new Solver();
|
||||||
assertFalse(solver.legal(-1, 0, 1));
|
assertFalse(solver.isLegal(-1, 0, 1));
|
||||||
assertFalse(solver.legal(0, -1, 1));
|
assertFalse(solver.isLegal(0, -1, 1));
|
||||||
assertFalse(solver.legal(0, 0, -1));
|
assertFalse(solver.isLegal(0, 0, -1));
|
||||||
assertFalse(solver.legal(0, 0, 10));
|
assertFalse(solver.isLegal(0, 0, 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Disabled
|
@Disabled
|
||||||
void unsolvableTest() {
|
void unsolvableTest() {
|
||||||
Solver solver = new Solver();
|
Solver solver = new Solver();
|
||||||
solver.setPos(0, 0, 1);
|
solver.set(0, 0, 1);
|
||||||
solver.setPos(0, 1, 1);
|
solver.set(0, 1, 1);
|
||||||
assertFalse(solver.solve());
|
assertFalse(solver.solve());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue