Рекурсивный алгоритм решения судоку с проверкой найденного решения на единственность | Статья в журнале «Молодой ученый»

Отправьте статью сегодня! Журнал выйдет 26 октября, печатный экземпляр отправим 30 октября.

Опубликовать статью в журнале

Автор:

Рубрика: Информационные технологии

Опубликовано в Молодой учёный №51 (341) декабрь 2020 г.

Дата публикации: 13.12.2020

Статья просмотрена: 2729 раз

Библиографическое описание:

Евстратов, В. В. Рекурсивный алгоритм решения судоку с проверкой найденного решения на единственность / В. В. Евстратов. — Текст : непосредственный // Молодой ученый. — 2020. — № 51 (341). — С. 8-11. — URL: https://moluch.ru/archive/341/76568/ (дата обращения: 17.10.2024).



В данной статье приводится рекурсивный алгоритм решения судоку (с помощью «грубой силы»). Приводится способ проверки найденного решения на единственность с помощью модификации того же алгоритма. Доказывается, что этот способ работает для любого судоку.

Ключевые слова: судоку, решение судоку, рекурсия, рекурсивный алгоритм, единственность решения судоку.

Судоку — это незамысловатая головоломка, главной целью которой является заполнение квадрата 9 х 9 ячеек числами от 1 до 9 по специальным правилам. Решение судоку — вид досуга, однако существуют соревнования по его скоростному решению.

Написание программы для автоматического решения судоку является упражнением для программиста, изучающего алгоритмы. В настоящее время существует множество онлайн сервисов, позволяющих подобрать решение для классического судоку [1], [2]. Также, можно найти примеры программ на разных языках программирования, решающие судоку и использующие как «человеческие» методы решения судоку [3], так и алгоритм Х (алгоритм Кнута) для поиска точного покрытия множества [4].

В приведенных выше примерах не учитывается проверка «правильность» поставленной задачи. Напомним, что правильным (валидным) судоку является судоку с такими входными данными, которое имеет одно единственное решение [5].

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

Идея алгоритма

Напомним правила классического судоку [5]:

  1. Поле головоломки представляет собой квадрат, состоящий из 81 клетки;
  2. Часть клеток изначально заполнены числами от 1 до 9 (подсказки);
  3. В каждом ряду и столбце любое число от 1 до 9 может встречаться лишь один раз;
  4. Кроме того, все поле делится еще на 9 блоков 3x3, в которых цифры от 1 до 9 тоже могут встречаться лишь один раз;
  5. Задача заключается в том, чтобы заполнить все клетки цифрами с учетом указанных ограничений.

Нельзя забывать:

  1. Валидное судоку должно иметь одно и только одно решение.

Блок-схема рекурсивного решения судоку без проверки на валидность представлена на рисунке 1. Рекурсивный вызов происходит внутри цикла (овальный блок «решатель судоку»), который вызывает саму эту функцию.

Необходимо понимать, что во время работы этого алгоритма информация о поле головоломки присутствует где-либо в программе (в глобальной переменной или всегда передаётся внутрь по указателю и пр.). Шаги по чтению/записи в это структуру данных в данной блок-схеме опущены, т. к. в общем случае они могут быть разными, и они ухудшают восприятие блок-схемы.

Блок условия «Входные данные валидны?» представляет собой проверку, только на то, что в каждом строке/стобце/блоке числа не повторяются. Обратите внимание, что в данном алгоритме не используются разнообразные методы решения судоку «последний герой», «выбора нет» и прочие [6].

Блок условия «Есть свободная клетка?» проверяет, существует ли на поле свободная клетка, если да, то следующее число мы будем записывать в неё.

Блок-схема рекурсивного решения судоку

Рис. 1. Блок-схема рекурсивного решения судоку

Проверка решения на единственность

Возьмем поле для судоку, которое гарантированно будет иметь больше одного решения (рисунок 2 слева). Рекурсивный алгоритм будет по очереди заполнять клетки этого поля, пока в конце концов не найдет подходящее решение (рисунок 2 справа).

Судоку с несколькими решениями (слева), процесс работы рекурсивного алгоритма (справа)

Рис. 2. Судоку с несколькими решениями (слева), процесс работы рекурсивного алгоритма (справа)

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

«Пустое» судоку заполняется от 1 до 9(слева) и от 9 до 1 (справа)

Рис. 3. «Пустое» судоку заполняется от 1 до 9(слева) и от 9 до 1 (справа)

Доказательство

Поле судоку будем представлять в вдие 81-значного числа. Причем старшинство разрядов должно соответствовать обходу алгоритмом клеток поля судоку. Каждое такое число будем называть полем судоку.

Например, полю на рисунке 3 слева будет соответствовать число

1234567894567891237…8531978531642.

Представим теперь последовательность чисел от 0 до 10^81–1. Числа меньшие 10^80 будем дополнять для удобства незначащими лидирующими нулями:

0000000000…0000000000

0000000000…0000000001

0000000000…0000000002

1000000000…0000000000

1000000000…0000000001

9999999999…9999999998

9999999999…9999999999

Удалив из этой последовательности все невалидные поля судоку мы получим множество всех возможных решенных судоку.

Наложим на это множество «маску» из нашего изначального поля (пустые клетки — любое число, заполненная клетка должна точно совпасть с соответствующей позицией числа из полученного выше множества). Удалив все поля, несоответствующие маске мы получим множество всех возможных решений нашего судоку. Причем поля (числа) в этом множестве будут отсортированы по возрастанию.

Производя полный перебор путём подстановки в свободные клетки чисел от 1 до 9 мы «продвигаемся» по этой последовательности от меньших чисел к большим. А подставляя числа от 9 до 1 мы «продвигаемся» от больших к меньшим.

Если в множестве возможных решений больше одного элемента, то алгоритм найдет разные ответы: самое «большое» поле-число и самое «маленькое» поле-число. Если в множестве ровно 1 элемент (единственное решение судоку), то эти ответы совпадут.

Примечание по эффективности полного перебора

На первый взгляд может показаться, что рекурсивный полный перебор поиска решения судоку должен занимать очень большое время (10^81 операций, например). Однако, для написанной программы автору не удалось найти примера судоку, который решался бы программой дольше, чем за 1 секунду.

Если убрать проверку судоку на валидность перед запуском основного алгоритма, и попробовать, например, решить судоку, где в первых двух клетках находятся «1», а остальные клетки пустые (очевидно, невалидные входные данные), то действительно, программе требуется значительное время, чтобы понять, что ответа не существует (автор ни разу этого не дождался).

Заключение

Как говорилось ранее, написание программы для решения судоку является упражнением для программиста. Однако, проверка решения на единственность не так очевидна.

Следующим по сложности упражнением может стать проверка единственности решения судоку для более эффективного алгоритма — алгоритма X.

Литература:

  1. Решатель судоку. — Программа: веб-сервис — URL: https://sudokus.ru/reshateli/ (дата обращения 10.12.2020)
  2. Sudoku solver. — Программа: веб-сервис — URL: https://sudokuonline.ru/resatel-sudoku-onlajn/ (дата обращения 10.12.2020)
  3. Решаем судоку на JavaScript. — Текст: электронный // Хабр. — URL: https://habr.com/ru/post/113837/ (дата обращения 10.12.2020)
  4. Решаем судоку с помощью Алгоритма X. — Текст: электронный // Хабр. — URL: https://habr.com/ru/post/462411/ (дата обращения 11.12.2020)
  5. Судоку. — Текст: электронный // Википедия свободная энциклопедия. — URL: https://ru.wikipedia.org/wiki/Судоку (дата обращения 10.12.2020)
  6. Методы решения судоку. — Текст: электронный // Хабр. — URL: https://habr.com/ru/post/173795/ (дата обращения 11.12.2020)
Основные термины (генерируются автоматически): судоку, решение, число, полный перебор, рекурсивный алгоритм, решение судоку, блок условия, написание программы, рекурсивное решение судоку, свободная клетка.


Ключевые слова

рекурсия, судоку, решение судоку, рекурсивный алгоритм, единственность решения судоку

Похожие статьи

Метод ветвей и границ для решения задачи о коммивояжёре

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

Линейное программирование

В данной статье рассматривается задача линейного программирования и возможный способ её решения — симплекс метод. Приведены примеры, поясняющие, что такое линейное программирование и симплекс метод.

Численные методы решения систем линейных алгебраических уравнений. Метод Гаусса

В статье рассматривается алгоритм метода Гаусса для решения систем линейных алгебраических уравнений. Выбран язык Maple, как наиболее оптимальный для реализации алгоритма. В статье содержится листинг программного кода.

Аппроксимация полиномов n степени методом наименьших квадратов

В данной статье рассмотрено решение проблемы уменьшения суммы квадратов отклонений определённых функций от искомых переменных для полиномиальных уравнений n степени. Приведено подробное решение для уравнений 2 степени, рассматриваемой проблемы. Предс...

Алгоритм построения простых чисел

Настоящая статья посвящена выводу формул и разработке алгоритма поиска простых чисел в заданном числовом интервале. Данный алгоритм также применим для проверки факта, является ли данное число простым или нет.

Применение различных подходов к решению задач теории вероятностей при подготовке к экзаменам

Существуют различные методы решения задач теории вероятностей. Решение задач при помощи стандартных формул теории вероятностей (формулы сложения/умножения вероятностей/условной вероятности/ Байеса/ полной или не полной вероятности), решение методом п...

Особенности проектирования и криптоанализа асимметричной криптографической системы RSA

В данной статье рассматриваются некоторые особенности проектирования асимметричной (открытой) криптосистемы RSA, проводится обзор тестов на принадлежность классу простых чисел, а также рассматривается выбор показателей степеней чисел при кодировании....

Асимптотика решения бисингулярной задачи на бесконечной прямой с квадратичной особенностью по времени

В работе построено асимптотическое разложение решения задачи Коши для бисингулярной параболического уравнения, в случае, когда решение соответствующего «вырожденного» уравнения имеет полюс второго порядка по времени в начальной точке. Асимптотика реш...

Метод анализа иерархий для определения лучшей альтернативы

В статье рассмотрен пример для выбора лучшей альтернативы с помощью метода анализа иерархий.

Определение топологических компонентов диаграмм узловых путевых структур с помощью полинома Джонса

В статье изложены основные вопросы определения компонентов топологической диаграммы путевой структуры любого железнодорожного узла с помощью полиномиального инварианта Джонса. Представленный способ расчета основан на методах теории узлов и может быть...

Похожие статьи

Метод ветвей и границ для решения задачи о коммивояжёре

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

Линейное программирование

В данной статье рассматривается задача линейного программирования и возможный способ её решения — симплекс метод. Приведены примеры, поясняющие, что такое линейное программирование и симплекс метод.

Численные методы решения систем линейных алгебраических уравнений. Метод Гаусса

В статье рассматривается алгоритм метода Гаусса для решения систем линейных алгебраических уравнений. Выбран язык Maple, как наиболее оптимальный для реализации алгоритма. В статье содержится листинг программного кода.

Аппроксимация полиномов n степени методом наименьших квадратов

В данной статье рассмотрено решение проблемы уменьшения суммы квадратов отклонений определённых функций от искомых переменных для полиномиальных уравнений n степени. Приведено подробное решение для уравнений 2 степени, рассматриваемой проблемы. Предс...

Алгоритм построения простых чисел

Настоящая статья посвящена выводу формул и разработке алгоритма поиска простых чисел в заданном числовом интервале. Данный алгоритм также применим для проверки факта, является ли данное число простым или нет.

Применение различных подходов к решению задач теории вероятностей при подготовке к экзаменам

Существуют различные методы решения задач теории вероятностей. Решение задач при помощи стандартных формул теории вероятностей (формулы сложения/умножения вероятностей/условной вероятности/ Байеса/ полной или не полной вероятности), решение методом п...

Особенности проектирования и криптоанализа асимметричной криптографической системы RSA

В данной статье рассматриваются некоторые особенности проектирования асимметричной (открытой) криптосистемы RSA, проводится обзор тестов на принадлежность классу простых чисел, а также рассматривается выбор показателей степеней чисел при кодировании....

Асимптотика решения бисингулярной задачи на бесконечной прямой с квадратичной особенностью по времени

В работе построено асимптотическое разложение решения задачи Коши для бисингулярной параболического уравнения, в случае, когда решение соответствующего «вырожденного» уравнения имеет полюс второго порядка по времени в начальной точке. Асимптотика реш...

Метод анализа иерархий для определения лучшей альтернативы

В статье рассмотрен пример для выбора лучшей альтернативы с помощью метода анализа иерархий.

Определение топологических компонентов диаграмм узловых путевых структур с помощью полинома Джонса

В статье изложены основные вопросы определения компонентов топологической диаграммы путевой структуры любого железнодорожного узла с помощью полиномиального инварианта Джонса. Представленный способ расчета основан на методах теории узлов и может быть...

Задать вопрос