Как я могу генерировать головоломки Судоку?

17

Я пытаюсь сделать генератор головоломок судоку. Это намного сложнее, чем я ожидал, и чем больше я увлекаюсь этим, тем сложнее становится!

Мой текущий подход состоит в том, чтобы разбить проблему на 2 этапа:

  1. Создайте полную (решенную) головоломку судоку.
  2. Удалите числа до тех пор, пока они не будут решены и у них будет только 1 решение

На шаге 1, так как я использую методы грубой силы, я сталкиваюсь с некоторыми проблемами во время выполнения. Есть ли оптимальный способ заполнить полную головоломку судоку?

На шаге 2, какой алгоритм я должен использовать, чтобы «озадачить» решенную судоку?

user223150
источник
Этот вопрос содержит некоторую информацию, которую вы можете извлечь из того, как генерировать пазлы
ratchet freak
3
Этот вопрос также задавался на Puzzling (и там есть лучшие ответы): puzzling.stackexchange.com/questions/142/…
congusbongus

Ответы:

30

У меня самая продаваемая игра Судоку в магазине приложений для iOS. Вот как я генерировал головоломки.

Сначала у меня есть приложение-генератор головоломок. Но это не часть кода игры. Это отдельное приложение, которое я использую для создания головоломок. Он сильно модифицирован, поэтому я могу настроить его для создания различных типов паттернов, рейтингов сложности, количества подарков и т. Д. Генерировать головоломки и получать постоянный уровень сложности сложно на лету, и это займет больше времени, чем игрок хотел бы ждать. Итак, я генерирую то, что я называю «начальными головоломками», и именно это используется кодом игры для генерации головоломок, в которые играют люди.

Я не отвечаю, как кодировать генератор здесь. Вы можете гуглить и найти тонны кода генератора головоломок онлайн. Начни там. Но чтобы сделать хорошую игру, нужно сделать хорошую игру. Моя игра не генерирует головоломки на лету.

Моё приложение-генератор головоломок работает так, что оно генерирует тысячи головоломок в минуту, но они не все хороши и не все соответствуют определенному уровню сложности. Генератор создает головоломку, затем решает ее, вычисляет рейтинг сложности и оценивает головоломку на основе методов, необходимых для ее решения, и определяет, требуется ли угадывание для ее решения (что обычно плохо). Он выбрасывает любые головоломки, которые не соответствуют критериям. Для сложных, но не невозможных головоломок на быстрой машине может потребоваться час, чтобы создать 100 головоломок, которые точно соответствуют моим требованиям. Вот почему я не делаю это в приложении. Создание головоломок на лету с этими жесткими характеристиками не сработает для того качества головоломок, которое есть в моем приложении.

Головоломки - это строки длиной 162 символа, 81 символ с цифрами и тире или точками, где должны быть пробелы, а затем еще 81 с решением. Затем столбцы для каждой статистики, например, сколько синглов, пар и т. Д.

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

Я называю их загадками семян и вот что я имею в виду. Числа в игре судоку на самом деле просто жетоны. Вместо цифр 1-9 они могут быть цветами, символами или буквами. Так что мои загадки с семенами - это не цифры, а буквы ai. Каждая головоломка с семенами меняется на лету, чтобы создать играбельную головоломку:

  1. Перемешать числа / токены. Когда я превращаю буквы ai обратно в числа 1-9, таблица поиска рандомизируется. Это означает, что a не всегда 1. Это само по себе создает около 300 000 вариаций для каждой головоломки.
  2. Поверните головоломку на 90, 180 или 270 градусов. Это добавляет еще 4 варианта.
  3. Флоп головоломки по горизонтали, вертикали или оба. Это добавляет еще 4 варианта.

Следовательно, каждая начальная головоломка может создать 5 806 080 вариаций. Я проверил это на поле с реальными игроками. Люди не знают, что они играют в одну и ту же головоломку. На самом деле это невозможно. Только если они заметят, что шаблон, в котором даны, одинаков каждый раз. Но даже с 100 различными семенами никто не заметит. Миллион пользователей моей игры не имеет. Я также проверил это с решающими приложениями. Приложение решателя не решит головоломку так же, как при повороте или провале. Иногда он даже анализирует его как другой уровень сложности, хотя технически это та же головоломка.

Тем не менее, книга Big Bad Sudoku Book содержит 10 из 1000 головоломок с семенами на 5 уровнях сложности и несколько типов головоломок. Это значит, что в моей игре миллиарды головоломок. С каждыми 10 000 загадками семян есть 58 060 800 000 различных загадок.

В Книге Судоку версии 4 (выйдет в 2016 году) я нашел способ уточнить точную головоломку из этих 58 миллиардов и получить такую ​​же головоломку на устройстве каждого игрока.

badweasel
источник
Очень полезный пост. Проверяете ли вы каким-либо образом семена, которые вы генерируете, из других семян, что означает, что у вас есть идентичные семена?
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. Чтобы удалить числа, используйте этот алгоритм:
    • Выберите случайное число, которое вы еще не пытались удалить
    • Удалите номер, запустите ваш решатель с дополнительным условием, что он не может использовать удаленный номер здесь
    • Если решатель находит решение, вы не можете удалить номер
    • Повторяйте до тех пор, пока вы не удалите достаточно номеров (или вы больше не можете удалить)

Это очень простой (и наивный) метод, поэтому нет гарантии, что вы получите головоломки определенной сложности - помимо количества пропущенных чисел, которое есть - или даже если вы можете даже удалить желаемое количество чисел. Надеюсь, это поможет в любом случае.

congusbongus
источник
Убедитесь, что решатель не может найти несколько решений из одного состояния. Обычно должно быть только одно решение. Кроме того, вы можете проверить, какие логические шаги должен предпринять решатель, чтобы найти решение для определения сложности, например, нужно ли ему использовать стратегию x-wing или ...?
OriginalDaemon
1
@OriginalDaemon относительно вашей первой точки, она покрыта третьей точкой: если удаление этого числа приводит ко второму решению, вернитесь назад.
congusbongus
0

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

Теперь, перейдя к теме, есть также способ генерировать аналогичные судоку, просто

  1. Перестановка строк.
  2. Другое простое решение - начать с заполнения sudoku, содержащего минимум 17 цифр (это проверенный минимум, чтобы найти уникальное решение), и заполнить следующие разные стратегии (например, в предыдущей ссылке стратегии разделены на трудности, вы может сделать что-то подобное), пока вы не найдете уникальное решение.
  3. Был список математика, пытающегося найти 16-значное уникальное решение судоку со списком HUGEEEEEE из 17 цифр судоку. Я не могу вспомнить, есть ли у него какая-либо копия записи, но я совершенно уверен, что если вы сможете предложить ему другое 17 уникальное решение, Судоку будет более чем рад позволить вам использовать его данные.

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

Дэвид Санчес
источник
Хм, ссылка для решателя судоку, а не генератора.
Гринольдман
@greenoldman ДА, ЕГО РЕШИТЕЛЬ. Я думаю, что это интересно для пользователя, так как он в настоящее время метод, чтобы удалить число и решить. Ссылка дает стратегии для решения быстрее, он частично судоку
Дэвид Санчес
0

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

Обычно он генерирует головоломку с оставшимися 24-34 цифрами, и я до сих пор не знаю, как в мире им удается создать 17-значную головоломку.

Лоуренс Эка
источник