我试图用蛮力算法解决数独板,我不能真正让这个算法正常工作。
为每一行、每列和每一个盒子创建一个对象,其中包含属于实际列、正方形和行的所有正方形(单元格),这在 legalValue() 中用于检查是否可以将值放入单元格中。
我找不到使算法起作用的结构。
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;
}
这是 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
添加了板的重置
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;
}
很长一段时间后,她是一个解决方案: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;
}