Як я можу генерувати пазли судоку?


17

Я намагаюся зробити генератор головоломок судоку. Це набагато важче, ніж я очікував, і чим більше я потрапляю в нього, тим важче стає!

Мій сучасний підхід - розділити проблему на 2 етапи:

  1. Створіть повну (розв’язану) головоломку судоку.
  2. Видаліть числа, поки це не вирішиться і не буде лише 1 рішення.

На кроці 1, оскільки я використовую методи грубої сили, я стикаюся з деякими проблемами часу виконання. Чи існує оптимальний спосіб заповнити повну головоломку судоку?

На кроці 2, який алгоритм я повинен використати, щоб "спантеличити" вирішений судоку?


у цьому питанні є деяка інформація, яку ви можете отримати, як генерувати пазли
храповик виродка

3
Це питання також було поставлено на карколомні (і має кращі відповіді там): puzzling.stackexchange.com/questions/142 / ...
congusbongus

Відповіді:


30

У магазині додатків iOS у мене найпопулярніша гра Судоку. Ось як я генерував пазли.

Спочатку у мене є додаток для генератора головоломок. Але це не є частиною коду гри. Це окремий додаток, який я використовую для створення пазлів. Він дуже модифікований, тому я можу встановити його для створення різних типів шаблонів, рейтингів складності, кількості подарунків і т. Д. Створення загадок і отримання стійкого рівня складності важко зробити на льоту і займає більше часу, ніж гравець хотів би чекати. Отже, я генерую те, що я називаю "насінні пазли", і саме це використовується кодом гри для створення загадок, які грають люди.

Я не відповідаю, як тут кодувати генератор. Ви можете знайти Google і знайти в Інтернеті тонни генератора головоломки. Почніть з цього. Але для того, щоб зробити хорошу гру, потрібно зробити хорошу гру. Моя гра не створює головоломок на льоту.

Те, як працює мій додаток-генератор головоломок, полягає в тому, що він генерує тисячі головоломок за хвилину, але вони не всі хороші і не всі відповідають певній оцінці складності. Генератор створює головоломку, потім розв’язує її і визначає оцінку складності, і визначає головоломку на основі методик, необхідних для вирішення головоломки, і визначає, чи потрібні здогадки для її розв’язання (що зазвичай погано). Він викидає головоломки, які не відповідають критеріям. Для важких, але не неможливих головоломок на швидкій машині може знадобитися година, щоб сформувати 100 головоломок, які відповідають моїм точним характеристикам. Ось чому я цього не роблю в додатку. Створення головоломок на ходу з тими жорсткими характеристиками не допоможе для якості головоломок, які я маю в своєму додатку.

Загадки - це рядки, довжиною 162 символи, 81 символ із цифрами та тиреми або крапками, де будуть пробіли, а потім ще 81 з рішенням. Потім стовпці для кожної статистики, наприклад, кількість синглів, парних і т.д.

Мій висновок з усіх сеансів генерації - це рядки з обмеженими комами та статистикою у вигляді стовпців. Я візьму, можливо, 10 000 головоломок, докладу їх до успіху та розберу по складності. Потім введіть їх у додаток, щоб побачити їх на ігровій дошці. Я також розглядаю їх на предмет зорової привабливості та видимих ​​зразків головоломки. Тоді я вручну вибираю з них.

Я називаю їх насінними загадками, і ось що я маю на увазі. Цифри в грі в судоку насправді просто лексеми. Замість числа 1-9 вони можуть бути кольорами, символами чи літерами. Тож мої насінні пазли - це не цифри, це букви аї. Кожна головоломка з насінням змінюється на льоту, щоб скласти грати головоломку:

  1. Рандомізуйте числа / жетони. Коли я повертаю літери ai назад до цифр 1-9, таблиця пошуку рандомізована. Це означає, що це не завжди 1. Саме по собі створюється близько 300 000 варіацій для кожної головоломки.
  2. Обертайте пазл на 90, 180 або 270 градусів. Це додає ще 4 варіанти.
  3. Розмовляйте головоломку горизонтально, вертикально або обидва. Це додає ще 4 варіанти.

Кожна головоломка насіння може, таким чином, створити 5 806 080 варіацій. Я випробував це на полі з реальними гравцями. Люди не знають, що вони по суті грають одну і ту ж головоломку. Насправді це неможливо. Тільки якби вони помітили, що візерунок, у якому є подарунки, щоразу однаковий. Але навіть з 100 різними насінням ніхто не помітить. Мільйон користувачів моєї гри ще ні. Я також тестував це з програмами solver. Додаток, що розв’язує, не вирішить головоломку так само, коли вона повертається чи перевертається. Він навіть іноді аналізуватиме його як інший рейтинг складності, хоча технічно це та сама головоломка.

Однак у книзі Big Bad Sudoku є 10-ти з 1000-х насіннєвих головоломок у 5 рівнях складності та декілька типів пазлів. Це означає, що в моїй грі є мільярди головоломок. На кожні 10 000 загадок насіння є 58 060 800 000 різних головоломок.

У Судоку Книзі версії 4 (вийшов у 2016 році) я з'ясував спосіб визначити точну головоломку з тих 58 мільярдів і отримати ту саму головоломку на пристрої кожного гравця.


Дуже корисний пост. Чи будь-яким чином ви перевіряєте, чи можна створити насіння, яке ви генеруєте, з інших насінин, це означає, що у вас є однакові насіння?
VLAS

Так. Я кидаю їх у текстовому тексті і роблю сорт. Потім видаліть дублікати. Я не думаю, що його ніколи не знімають. Насіння абсолютно унікальні. З двох різних насіння неможливо скласти одну головоломку. Колись я покажу точний процес, але не зараз, коли я все ще отримую прибуток від своїх методів. :)
badweasel

Насправді тут весь мій процес.
badweasel

2
+1 для розуміння того, що цифри - це лише лексеми, і спосіб зміни варіантів - просто змінити числа, присвоєні літерам.
С. Мітчелл

Дійсно корисна відповідь! Оскільки у вас є 3 стовпчики та 3 ряди, ви повинні мати можливість перемістити середній стовпчик вліво або вправо, а середній рядок вгору або внизу, щоб створити ще 4 варіанти. І замість того, щоб гортати головоломку вертикально або промальовувати її по горизонталі, ви могли просто торгувати лівим і правим стовпцями (і верхній і нижній рядки) ще на 4 варіанти. Тому я думаю, що ви повинні отримати 43 мільйони варіацій з одного насіння.
Roger_S

4

На кроці (1) Створіть повну (розв’язану) головоломку судоку, оскільки я використовую метод грубої сили, я стикаюся з деякими проблемами часу виконання. Чи існує оптимальний спосіб заповнити повну головоломку судоку?

Існує простий спосіб заповнити повну головоломку судоку - заповнення групи та круговий зсув.

  1. Заповніть перший ряд дев’ятьма різними числами.
  2. Заповніть другий ряд, який є зсувом першого рядка на три прорізи.
  3. Заповніть третій ряд, який є зсувом другого рядка на три прорізи.
  4. Заповніть четвертий ряд, який є зсувом третього на один проріз.


line 1: 8 9 3  2 7 6  4 5 1
line 2: 2 7 6  4 5 1  8 9 3 (shift 3)
line 3: 4 5 1  8 9 3  2 7 6 (shift 3)

line 4: 5 1 8  9 3 2  7 6 4 (shift 1)
line 5: 9 3 2  7 6 4  5 1 8 (shift 3)
line 6: 7 6 4  5 1 8  9 3 2 (shift 3)

line 7: 6 4 5  1 8 9  3 2 7 (shift 1)
line 8: 1 8 9  3 2 7  6 4 5 (shift 3)
line 9: 3 2 7  6 4 5  1 8 9 (shift 3)

Щоб користувач не помітив очевидного шаблону, може бути хорошою ідеєю рандомізувати порядок рядків і стовпців, щоб більше не було жодного шаблону. Поки всі 9 чисел у кожному рядку / стовпчику рухаються разом як одна атомна одиниця, дошка судоку завжди залишатиметься дійсною.

Ви отримуєте повну головоломку судоку. Для отримання більш детальної інформації ви можете шукати "зробити судоку".


3

Це не надто складно, за умови, що у вас є вирішувач судоку.

Створення судових рішень для судоку є важкою / цікавою проблемою, тому краще зберегти це для іншого питання. Або ви можете просто прочитати це і побачити, як ви йдете.

  1. Щоб створити розв’язану головоломку, просто запустіть розв’язувач на порожній дошці. Єдине застереження - ви повинні рандомізувати "здогадки", які використовує розв'язувач, інакше ви можете щоразу опинятися з тією ж головоломкою. Тобто, в якийсь момент розв'язувач спробує число для комірки; він може спробувати у такому порядку: 1, 2, 3, 4, ...і вибрати перший, який працює. Вам потрібно перетасувати цей порядок так , що він намагається, скажімо, 4, 7, 2, 9, .... Цей процес повинен бути таким же швидким, як і ваш вирішувач.
  2. Щоб видалити числа, використовуйте цей алгоритм:
    • Виберіть випадкове число, яке ви раніше не намагалися видалити
    • Вилучіть номер, запустіть вирішувач із доданою умовою, що він не може використати видалений номер тут
    • Якщо вирішувач знайде рішення, ви не можете видалити число
    • Повторюйте, поки ви не видалите достатню кількість (або більше не зможете видалити)

Це дуже простий (і наївний) метод, тому немає гарантії, що ви отримаєте загадки певної складності - окрім кількості пропущених чисел, яка є, - або якщо ви навіть можете вилучити потрібну кількість цифр. Сподіваюся, це все одно допомагає.


Переконайтесь, що вирішувач не може знайти кілька рішень з одного стану. Зазвичай має бути лише одне рішення. Крім того, ви можете перевірити, які логічні кроки потрібно вирішити, щоб знайти рішення для визначення складності, наприклад, чи потрібно було використовувати стратегію x-wing або ...?
OriginalDaemon

1
@OriginalDaemon щодо вашої першої точки, вона охоплена в третій крапці: якщо вилучення цього числа призведе до другого рішення, поверніться назад.
congusbongus

0

Я просто думаю, що цікаво вказати цю веб-сторінку , оскільки вона дуже допомогла мені для розробки проекту. Зробити судоку з унікальним рішенням далеко не просте завдання. У посиланні ви можете дізнатися, як автор (він справді зробив чудову роботу, це не я!), Знайшов кілька різних стратегій. Ви можете мати ідею створити власну розв'язку судоку.

Тепер, переходячи до теми, також існує спосіб генерувати подібний судокус

  1. Перестановка рядів.
  2. Інше просте рішення - почати з заповнення судоку мінімуму з 17 цифр (його перевірений мінімум, щоб знайти унікальне рішення), і заповнити наступні різні стратегії (наприклад, у попередньому посиланні стратегії розділені на труднощі, ви можна зробити щось подібне), поки ви не досягнете унікального рішення.
  3. Був список математика, який намагався знайти 16-ти початкову цифру унікального рішення судоку, зі списком HUGEEEEEE з 17 цифр sudokus. Я не можу пригадати, чи є у нього який-небудь примірник написання, але я впевнений, що, якщо ви можете запропонувати йому інші 17 унікальних рішень sudoku, буде більш ніж радий дозволити вам використовувати його дані.

Ура і удачі з алгоритмом: D


Гм, посилання на судоку вирішувач, а не генератор.
greenoldman

@greenoldman ТАК, РОЗВИТКУ. Я думаю, що це цікаво для користувача, оскільки він є сучасним методом, щоб вилучити число та вирішити. Посилання дає стратегію для швидшого вирішення партії судоку
Девід Санчес

0

Мій вирішальник застосовує грубу силу і може знайти рішення протягом 20 мілісекунд. Використовуючи описаний вище метод видалення, мій генератор виробляє загадку протягом 200 мілісекунд.

Зазвичай він створює головоломку із залишкою близько 24-34 цифр, і я досі не знаю, як у світі їм вдається скласти 17-ти цифрний пазл.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.