import java.util.List;
import java.util.Random;
public class SudokuGenerator {
public Board generate() {
Board board = new Board();
fillBoard(board);
makeSolvable(board, 50);
return board;
}
private void fillBoard(Board board) {
BoardManager bm = new BoardManager();
Random r = new Random();
bm.setBoard(board);
int fieldsToFill = Field.POSSIBILITIES * Field.POSSIBILITIES;
// set all fields with random numbers if possible
// try to solve, if not possible remove one number and try again...
for (int i = 0; i < fieldsToFill; i++) {
int row = r.nextInt(Field.POSSIBILITIES);
int fieldIndex = r.nextInt(Field.POSSIBILITIES);
List remainingPos = bm.getField(Structure.ROW, row, fieldIndex)
.getRemainingPos();
if (remainingPos.size() > 0) {
int value = (Integer) remainingPos.get(r.nextInt(remainingPos
.size()));
boolean result = bm.trySetFieldPrivate(Structure.ROW, row,
fieldIndex, new Field(value, true));
if (!result) {
bm.undo();
}
} else {
bm.undo();
}
}
}
private boolean makeSolvable(Board board, int steps) {
BoardManager bm = new BoardManager();
bm.setBoard(board);
Random r = new Random();
int k = steps;
try {
// board filled, check solution
List solutions = bm.solve((Board) board.clone());
boolean solvable = !solutions.isEmpty();
while (k > 0) {
// remove random number and try again
board.removeRandomSetField();
solutions = bm.solve((Board) board.clone());
if (!solutions.isEmpty()) {
return true;
}
k--;
}
} catch (CloneNotSupportedException e) {
}
return false;
}
}