Очевидно, что если после последовательного прохода всех 4 вариантов на каждой ячейке ни одна не заполнилась — надо
1) Сохранить состояние поля
2) Заполнить первую ячейку первым теоретически подходящим числом
3) Запомнить что и чем запомнили
4) Гонять МЕТА до полного заполнения/противоречия
при противоречии вернуться к последнему сохраненному состоянию и изменить шаг 2).
Очень хотелось уйти от неэффективного перебора, а вариант «фиксируем значение в какой-то ячейке и гоняем алгоритм» очень близок к полному перебору. Точнее — к полному перебору прогнозов.
Ваш 4-й алгоритм при правильной реализации — это и есть перебор — поиск с возратом. А остальные алгоритмы просто урезают пространство поиска. Ну, во всяком случае на это так можно посмотреть. Т.е. в общем-то если всё сделано правильно, то алгоритм будет универсальным, просто в худшем случае вырождаться почти до полного перебора. Но смущает фраза в другом Вашем коментарии — «частичный перебор» — что имеется в виду?
Частичный перебор — перебираем только прогнозные варианты. 4-й включается в последнюю очередь и только для поиска негативного результата «этой цифры здесь быть не может». Обычно неплохо работает, когда поле уже немного заполнено.
Да, учитываю только негативный результат — чтобы уменьшить прогнозы. Обычно ячейки с минимальной длиной прогноза — это два варианта в ячейке. Если отбросить один, второй заполняет ячейку.
Не могу сказать, какая скорость работы у Вашего алгоритма, но алгоритм на основе танцующих ссылок Кнута решает несколько тысяч судоку любой сложности за секунду. Попробуйте провести сравнение.
Кстати там, в целом, используется очень правильный метод. Сначала подбор простыми алгоритмами и если ни один из них не подошел — используются более сложные (и т.д.) пока не будет найден приемлемый вариант хода. Все варианты не пробовал, несколько раз добегало до середины, но в итоге решение нашлось.
Эвристический решатель судоку