Iam trying to solve a sudoku board with a brute force algorithm, I cant really get this algorithm work correctly.
There is created a object for each row, column and box that contains all squares(cells) that belongs to the actually column, square and row, this is used in legalValue() to check if value can be placed in the cell.
I cant find the structure that make the algorithm to work.
boolean setNumberMeAndTheRest(Board board) {
if(getNext() == null) {
for(int i = 1; i <= board.getDimension(); i++) {
if(legalValue(i)) {
setValue(i);
}
}
board.saveSolution();
} else {
if(this instanceof DefinedSquare) {
getNext().setNumberMeAndTheRest(board);
} else {
for(int i = 1; i <= board.getDimension(); i++) {
if(legalValue(i)) {
setValue(i);
if(getNext().setNumberMeAndTheRest(board)) {
return true;
} else {
setValue(i);
}
}
}
return false;
}
}
return false;
}
Here is legalValue(int i);
/**
* Checks if value is legal in box, row and column.
* @param value to check.
* @return true if value is legal, else false.
*/
boolean legalValue(int value) {
if(box.legalValue(value) && row.legalValue(value) && columne.legalValue(value)) {
return true;
}
return false;
}
**4x4 Sudoku board INPUT**
0 2 | 1 3
0 0 | 0 4
---------
0 0 | 0 1
0 4 | 3 2
**Expected OUTPUT**
4 2 | 1 3
3 1 | 2 4
---------
2 3 | 4 1
1 4 | 3 2
**Actually OUTPUT**
4 2 | 1 3
2 4 | 3 4
---------
3 0 | 0 1
0 4 | 3 2
Added resetting of board
boolean setNumberMeAndTheRest(Board board) {
Board original = board;
if(getNext() == null) {
for(int i = 1; i <= board.getDimension(); i++) {
if(legalValue(i)) {
setValue(i);
}
}
board.saveSolution();
} else {
if(this instanceof DefinedSquare) {
getNext().setNumberMeAndTheRest(board);
} else {
for(int i = 1; i <= board.getDimension(); i++) {
if(legalValue(i)) {
setValue(i);
if(getNext().setNumberMeAndTheRest(board)) {
return true;
} else {
setValue(i);
}
}
}
board = original;
return false;
}
}
board = original;
return false;
}
Her is a solution, after a long time :D
boolean setNumberMeAndTheRest(Board board) {
if(next == null) {
board.saveSolution();
return true;
}
if(this instanceof DefinedSquare) {
return next.setNumberMeAndTheRest(board);
}
for(int i = 1; i <= board.getDimension(); ++i) {
if(legalValue(i)) {
setValue(i);
if(next.setNumberMeAndTheRest(board)) {
return true;
}
}
}
setValue(0);
return false;
}