Algoritmo Sudoku, força bruta [fechada]
Eu estou tentando resolver uma placa de sudoku com um algoritmo de força bruta, eu realmente não consigo fazer esse algoritmo funcionar corretamente.
Há um objeto criado para cada linha, coluna e caixa que contém todos os quadrados (células) que pertencem à coluna, quadrado e linha reais, isso é usado em legalValue () para verificar se o valor pode ser colocado na célula.
Eu não consigo encontrar a estrutura que faz o algoritmo funcionar.
<code> 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; } </code>
Aqui está legalValue (int i);
<code>/** * 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; } </code>
<code>**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 </code>
Adicionado redefinição de placa
<code>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; } </code>
Ela é uma solução, depois de muito tempo: D
<code>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; } </code>