Comments 33
Есть одно существенное замечание. Что считать одним судоку? Окончательное решение или начальную задачу? Для одного и того же окончательного решения можно составить множество различных начальных задач разной сложности.
Мне кажется что для решающего эти разные задачи вообще говоря и есть разные судоку, т.е. задач судоку больше чем его решений.
Я понял что считают авторы. А вот что считать судоку? Решение или задачу?
Подсчитать число задач, конечно, намного сложней, но сама эта задача более интересная. Правда, нужно уметь отбрасывать всякие вырожденные случаи (типа заполненной доски с одной неоткрытой клеткой). Надеюсь прочитать про её решение (если оно, конечно, есть).
Начальная задача это когда удаление еще одной клетки дает несколько решений. Таких начальных задач намного больше чем решений.
Судоку это логическая головоломка. Начальные задача имеет единственное решение, иначе можно нарисовать пустое поле и как говориться найди все решения ;)
Встречал мнение, что хорошая задача судоку допускает единственное решение.
Отмечу, что знание этого можно использовать как априорную информацию при решении. Допустим, перебирая варианты, вы пришли к чему-то такому:
...
?** ?** ***
?** ?** ***
...
Где "?" — либо 1, либо 2, а "*" — неважно. Это значит, что если решения есть, то их как минимум два, и вариант можно отбросить.
Существует еще несколько операций, которые сокращают количество сеток для рассмотрения. Если у нас есть пара чисел {a,b} такая, что a и b находятся в одном столбце, причем a — на i-й строке, а b — на j-ой, и, ко всему прочему, есть такая же пара в другом столбце, причем для этого столбца a уже находится на j-ой строке, а b — на i-ой (т.е. эти четыре числа находятся в углах некоторого прямоугольника, и противоположные числа равны), то мы можем поменять местами числа в обеих парах и получить новую корректную полосу с тем же количеством конечных сеток.Правда там в контексте количества возможных сеток, но эти же трюки можно применять и при эвристике решения.
Вот здесь описаны хорошие методы для решения.
746 835 219
821 469 573
539 748 621
278 516 934
614 392 758
962 187 345
153 624 897
487 953 162
Спасибо за статью, -2 часа на работе)
Я больше года назад начал идти по тому пути, что здесь описан, но в итоге, когда всё скатывается в реальный перебор, а не понятный и простой устный подсчёт, бросил и пошёл по другому пути (который изначально показался сложнее и менее перспективным). Подозреваю, что авторы оригинальной статьи тоже что-то про это знают и частично это и использовали при сокращении количества комбинаций для полос.
Кстати, у меня те же числа получались — 36888 и 416. Только либо я чего-то не понял, либо сам ошибаюсь, но это лишь для одного стартового набора данных (стандартный набор в терминологии перевода).
Буду ждать перевода второй части, поскольку сам первый путь до конца не осилил, может он поможет мне дописать статью :)
Я в качестве первого набора данных брал только заполненную первую строку, а не первый блок (я его квадратом называю). Ну и при заполненном первых строке, столбце и квадрате, у меня получалось 40 стартовых наборов данных, которые между собой не эквивалентны.
Пробовал менять подход и расширять стартовый набор в другом порядке, но всё равно утыкался в необходимость перебора слишком большого числа не эквивалентных наборов и в итоге сдался и решил пойти по другому пути, комбинируя перебор с масками (возможно, про это будет во второй части Вашего перевода).
Я как-то раз задумывался над этим. Нашёл чисто эмпирически такое свойство: если взять решение
123 456 789
456 789 123
789 123 456
234 567 890
567 890 234
890 234 567
345 678 901
678 901 345
901 345 678
То если заменить цифры по правилу перестановки — тоже получится решение судоку. Если поменять местами столбцы внутри троек или тройки столбцов — тоже получится решение судоку. То же для строк.
Я, правда, это наблюдение никак не анализировал, поэтому подозреваю, что описанные манипуляции +транспонирование не порождают всё множество возможных решений.
Путём перестановок\поворотов\отражений и перенумерований можно получить эквивалент, но не уникальную сетку.
По сути, Вы будете каждый раз решать одну и ту же задачку. Этим грешат многие генераторы головоломок.
Не успел поправить, не 0, а 1, и в строках 7-9 не 1, а 2.
Она использует алгоритм танцующих ссылок и находит решение очень быстро.
В частности для примера в статье:
3 _ _ 2 _ 1 _ _ _
7 4 _ _ _ _ _ 1 9
_ 2 _ _ 6 _ 5 _ _
_ 3 _ 7 4 _ _ _ 1
_ _ 8 _ _ _ 9 _ _
6 _ _ _ 9 2 _ 5 _
_ _ 2 _ 8 _ _ 4 _
1 5 _ _ _ _ _ 9 7
_ _ _ 9 _ 3 _ _ 2
найдено одно и единственное решение:
3 9 5 2 7 1 4 8 6
7 4 6 8 3 5 2 1 9
8 2 1 4 6 9 5 7 3
5 3 9 7 4 8 6 2 1
2 7 8 5 1 6 9 3 4
6 1 4 3 9 2 7 5 8
9 6 2 1 8 7 3 4 5
1 5 3 6 2 4 8 9 7
4 8 7 9 5 3 1 6 2
Судоку: так сколько же их? Часть 1/2