Это решение для судоку, и каждый квадрат имеет этот метод. Моя идея заключается в том, что если один экземпляр этого метода проходит цикл без поиска допустимых значений, он вернется к предыдущему методу, который вызвал его, и продолжит цикл - пробуя следующее значение из цикла for. Я надеялся, что этого хватит для отступления, но все мои испытания терпят неудачу, и я совершенно не знаю, как я собираюсь решить эту проблему./Конец нуб-плачНевозможно выяснить, как включить обратный трассировку в мой псевдорекурсивный метод.
public boolean recursive() {
for(int i = 1; i <= boardSize; i++) {
if(!validValue(i)) {
continue;
} else {
setValue(i);
if(getNext() == null) // This signifies that I am at the end of the list
return true;
else
getNext().recursive(); // same method in the next sudoku square
}
}
return false;
}
Этот код не является достаточным, чтобы увидеть, что происходит. Какова структура алгоритма и что делают 'validValue',' setValue', 'getNext' и' recursive'? Хотя я не могу с уверенностью сказать, что не так, я предполагаю, что вы не отменяете изменения во время обратного отслеживания. Когда поиск не находит решение, он должен сбросить любое постоянное состояние, которое оно изменило перед обратным трассировкой. – Heatsink
Извините, я сделал плохое предположение, думая, что имена методов не требуют пояснений. validValue (i) проверяет, находится ли i в поле box/row/column, которое относится к квадрату. setValue() - это setter для значения в каждом квадрате. getNext() возвращает следующий квадрат на доске sudoku. Я сожалею, что не видел этого, но почему мне нужно сбросить значение, если метод setValue() просто перезапишет любое неправильное значение? – jollyroger
Тогда это, вероятно, не относится к вашему делу. В некоторых алгоритмах поиска рекурсивный экземпляр может перезаписать предположение, сделанное более ранним шагом. Поскольку каждый рекурсивный экземпляр изменяет отдельный фрагмент данных в вашем алгоритме, отмена не имеет значения. – Heatsink