Я создаю решатель судоку, который использует метод «пробы и неудача» для решения любой проблемы. Мой алгоритм:
1) Обновление (метод, который удаляет любое возможное значение, которое уже задано как окончательное значение для элемента в той же строке, столбце или квадрате)
2) Получить минимальный элемент, который имеет минимальное количество возможных значений
3) начните решать, предполагая, что первое возможное значение является окончательным значением
4) сохранить текущее состояние в стек
5) Попробуйте решить
5-а) Если решено, вернуться
5-б) если не решено и с недействительным судоку, то всплывает предыдущее состояние
6) Повторите шаг 3) для всех возможных значений (9)
7) Повторяйте шаг 2), пока головоломка не будет решена.
это мой код
Stack<Element[][]> myStack= new Stack<>();
private Element[][] mySudoku;
public void solve(){
update();//remove all final values from all possible values for each element
if(isSudokuSolved(mySudoku)){
return;
}
//find a cell that is not confirmed and has the minimal candidates
int celli=-1,cellj=-1, p=10;
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(mySudoku[i][j].getValue()==0){
if(mySudoku[i][j].getPossibleValues().size()<p){
celli=i;
cellj=j;
p=mySudoku[i][j].getPossibleValues().size();
}
}
}
}
try {
for (int c = 0; c < mySudoku[celli][cellj].getPossibleValues().size() - 1; c++) {
//save state
Element[][] copy=deepCopy(mySudoku);//copy the current state
myStack.push(copy);
//apply candidate to cell
mySudoku[celli][cellj].setValue(mySudoku[celli][cellj].getPossibleValues().get(c));
update();//check is solved
if(checkValidInputSudoku(mySudoku)){
solve();
}else{
try {
mySudoku = myStack.pop();
} catch (EmptyStackException est) {
//do nothing
}
}
}
} catch (Exception e) {
}
//if we have reached here then we are at the last possible value for the candidates so confirm candidate in cell
if(celli!=-1 && cellj!=-1 && p!=10) {//Some problems happen here "out of Boundry -1 Error"
mySudoku[celli][cellj].setValue(mySudoku[celli][cellj].getPossibleValues().get(mySudoku[celli][cellj].getPossibleValues().size()-1));
}
}//end of solve method
Я потратил более 6 часов, пытаясь выяснить проблему. Я проверил метод Update(), метод deepCopy() и метод checkValidInputSudoku(). Все они работают нормально. Заранее спасибо