Как вы создаете доску судоку с уникальным решением? Я решил инициализировать случайную доску, а затем удалить некоторые цифры. Но мой вопрос в том, как сохранить уникальность решения?Как создать платы судоку с уникальными решениями
ответ
Easy:
- Найти все решения с эффективным алгоритмом обратного прослеживания.
- Если есть только одно решение, все готово. В противном случае, если у вас есть несколько решений, найдите позицию, в которой большинство решений отличается. Добавьте номер в эту позицию.
- Перейти к 1.
Я сомневаюсь, что вы можете найти решение, которое было бы гораздо быстрее, чем это.
Непросто дать общее решение. Вам нужно знать несколько вещей, чтобы создать определенный тип судоку ... например, вы не можете построить судоку с более чем девятью пустыми 9-числовыми группами (строки, 3x3 блоки или столбцы). Минимальные заданные числа (т. Е. «Подсказки») в единственном решении Судоку, как полагают, составляют 17, но числовые позиции для этой Судоку очень специфичны, если я не ошибаюсь. Среднее количество подсказок для судоку составляет около 26, и я не уверен, но если вы оставите числа заполненной сетки до 26 и оставите их симметрично, у вас может быть действительная судоку. С другой стороны, вы можете просто случайно вывести числа из готовых сеток и проверить их с помощью CHECKER или других инструментов, пока не появится OK.
Проверено # мин. Ключей 2b 17 :) – rhbvkleef
Вы можете обмануть. Начните с существующей доски Sudoku, которая может быть решена, а затем поиграйте с ней.
Вы можете поменять местами любую строку из трех блоков 3x3 с любой другой строкой. Вы можете поменять любой столбец из трех блоков 3x3 с другим столбцом. Внутри каждой строки блока или столбца блока вы можете менять отдельные строки и отдельные столбцы. Наконец, вы можете переставить числа так, чтобы в заполненных позициях находились разные числа, пока перестановка согласована по всей доске.
Ни одно из этих изменений не сделает разрешимую доску неразрешимой.
, но как насчет уникальности? как вы выбираете пустые ячейки, чтобы сохранить уникальное решение? –
@ kvphxga: Вы начинаете с частичной доски с уникальным решением. Ни один из разрешенных свопов не влияет на уникальность решения. – rossum
Вот как моя собственная программа SuDoKu делает это:
старт с полным, действительным борту (заполняется с 81 номерами)
составить список всех 81 ячейки позиции и случайным образом перетасовать его.
Пока список не пуст, перейдите в следующую позицию из списка и удалите номер из связанной ячейки
Уникальность теста с использованием быстрого решателя (при необходимости, с возвратом). Мой решатель способен подсчитать все решения, но он останавливается, когда он находит более одного решения.
Если текущая плата имеет только одно решение, перейдите к шагу 3) и повторите.
Если текущая плата имеет более чем одно решение, отменить последнее удаление (этап 3), и по-прежнему шаг 3 со следующей позицией из списка
стопа, когда вы проверили все 81 позиций.
Это дает не только уникальные доски, но доски, где вы не можете удалить любые другие номера, не разрушая единственность решения.
Конечно, это только вторая половина алгоритма. Первая половина найти полный действительный совет первый (в случайном порядке заполнения!) Он работает очень похож, но «в другом направлении»:
начать с пустой доской
надстройка случайное число в одной из свободных ячеек (ячейка выбирается случайным образом, а число выбирается случайным образом из списка чисел, действительных для этой ячейки в соответствии с правилами SuDoKu).
Используйте решатель обратного отслеживания, чтобы проверить, текущий совет имеет хотя бы один действительное решение. Если нет, отмените шаг 2 и повторите с другим номером и ячейкой. Обратите внимание, что этот шаг может создать полностью допустимые платы самостоятельно, но они никоим образом не являются случайными.
Повторяйте, пока плата не будет полностью заполнен числами
Я нашел ваш алгоритм особенно простым и эффективным. Благодарю. – krawyoti
Я немного озадачен '(3) Используйте решатель, чтобы проверить, имеет ли текущая плата хотя бы одно действующее решение.« Если вы добавили только один символ в пустую доску (на шаге 2), а затем проверите свои решатель на (в шаге 3), вы по существу решаете пустую доску. Я не думаю, что мой решатель так хорош, и что еще важнее, если он может решить пустую доску, тогда проблема получения правильного решения уже будет решена, и я могу перейти к шагу 4! – The111
@ The111: решить пустую доску легко, вы можете сделать это даже без компьютера. Но я ищу * заполненную * случайно заполненную доску, поэтому я не просто останавливаюсь после шага 3. –
Если P = NP, не существует полиномиальный алгоритм для генерации общих задач судоку ровно одно решение.
В своей магистерской диссертации Такаюки Ято определил The Another Solution Problem (ASP), где цель, заданная проблемой и некоторым решением, найти другое решение этой проблемы или показать, что никто не существует. Затем Ято определил ASP-полноту, проблемы, для которых трудно найти другое решение, и показали, что Sudoku является ASP-полным. Поскольку он также доказывает, что ASP-полнота подразумевает NP-твердость, это означает, что если вы разрешаете доски судоку произвольного размера, нет алгоритма с полиномиальным временем, чтобы проверить, имеет ли головоломка, которую вы создали, уникальное решение (если только P = NP).
Извините, что испортил ваши надежды на быстрый алгоритм!
Чтобы быть справедливым, вы можете генерировать несколько сотен уникальных головоломок в секунду, используя технику в выбранном ответе. – Grandpa
Ну, в этом случае я хотел бы это увидеть. Потому что, если вы пытаетесь создать дьявольскую судоку, иногда очень сложно проверить все возможные возможности. Для облегчения судоку с большим количеством начальных заполненных цифр, я согласен. – dyesdyes
Мои надежды на быстрый генератор головоломок Zebra почти исчезли, пока я не прочитал начало этой статьи (спасибо!) Внимательно. В решателе вам нужно найти решение (отсюда и решатель имен), в то время как в генераторе вам нужно создать головоломку - вам не нужно ее фактически решать (тот факт, что большинство подходов использует решатель как часть генератора, - это еще одна история) , Я не говорю, что ваше первое утверждение ложно, я говорю, что это не доказано в этой статье. – greenoldman
Я также считаю, что вам придется явно проверить уникальность. Если у вас меньше 17 givens, уникальное решение маловероятно: хотя еще не найдено, хотя пока неясно, может ли он существовать.)
Но вы также можете использовать SAT-решатель, так как против написания собственного алгоритма обратного отслеживания. Таким образом, вы можете в какой-то мере отрегулировать, насколько сложно будет найти решение: если вы ограничиваете правила вывода, используемые SAT-решателем, вы можете проверить, легко ли вы можете решить головоломку. Просто Google для «SAT решения судоку».
Здесь можно сделать классическую головоломку судоку (головоломка судоку с одним и единственным решением, предварительно заполненные квадраты симметричны вокруг центральной площади R5C5).
1) начинают с полной сеткой (с использованием начинку группы плюс циклический сдвиг, чтобы получить его легко)
2) удалить номер (ы) из двух симметричных квадратов, если очищенные квадратов можно сделать вывод, используя оставшиеся ключи.
3) повторите (2), пока не будут проверены все номера.
Используя этот метод, вы можете создать очень легкую головоломку судоку с программированием или без него. Вы также можете использовать этот метод для создания более сложных головоломок Sudoku. Вы можете искать «создать классическую судоку» на YouTube, чтобы иметь пошаговый пример.
- 1. Найти 9 3x3 "блоков" платы Судоку (Haskell)
- 2. Нужна помощь с алгоритмом обратного отслеживания для создания платы судоку
- 3. Как создать калькулятор заработной платы?
- 4. Как бы вы могли построить и взаимодействовать с сеткой, например, с помощью платы судоку?
- 5. Судоку Поколение Сложность
- 6. Как создать раскрывающийся список с уникальными значениями?
- 7. Pathfinding с решениями
- 8. судоку Java, эффективный способ для 4x4 судоку
- 9. Обнаружение платы Tesseract
- 10. Можно создать ограничения между решениями в Choco?
- 11. Судоку с AC3
- 12. Создать SQLite таблицу с уникальными записями
- 13. Создать ассоциативный массив с уникальными ключами
- 14. Управление несколькими решениями с NDepend
- 15. mongodb-C# создать документ с уникальными полями
- 16. Проект библиотеки с несколькими решениями
- 17. MYSQL Создать таблицу с уникальными значениями
- 18. Создать узел с уникальными отношениями в Neo4j
- 19. Создать все возможные подпоследовательности с уникальными элементами
- 20. Судоку решил найти решение для неразрешимой судоку
- 21. Судоку как CSP (согласованность дуги)
- 22. Генератор Судоку
- 23. Генератор генератора Судоку
- 24. Создание судоку желаемой сложности?
- 25. Судоку возвращается с помощью C#
- 26. Как связать сетку судоку с Kendo?
- 27. Очистка таблицы Судоку
- 28. Как создать таблицу в erlang mnesia с несколькими уникальными столбцами?
- 29. Как создать список с уникальными значениями со словарем (многотоновый рисунок)
- 30. Как создать маршруты с уникальными идентификаторами в NodeJS
Я думаю, что вы правы, но как оценивать уровень для борада, сгенерированного таким образом, кажется, нет никакого параметра, чтобы контролировать трудность. –
Ну, это другой вопрос, гораздо сложнее. Уверен, что он добавляет больше цифр, тем легче. – TMS
Не нужно искать все решения, достаточно найти второй. –