Судоку, также называемое Number Place, представляет собой логическую комбинаторную головоломку с расстановкой чисел. Цель состоит в том, чтобы заполнить сетку 9x9 цифрами, чтобы каждый столбец, каждая строка и каждая из девяти подсеток 3x3, составляющих сетку, содержали все цифры от 1 до 9.
В этом руководстве мы собираемся разработать решатель судоку на Java с помощью Eclipse. Мы будем использовать рекурсивный подход BackTracking. Простой, почти наивный подход. В следующем уроке вы научитесь применять более умный подход.
Обратите внимание, что вы также можете посмотреть это руководство в видео на YouTube:
Проектирование доски
Первый шаг - спроектировать доску, представляющую собой сетку судоку. Это будет двумерный массив целых чисел. Числа будут храниться от 1 до 9. Ноль будет указывать на то, что ячейка сетки не назначена.
В конструкторе класса Sudoku мы скопируем 2D-массив целых чисел, введенный в параметрах свойства 2D-массива нашего класса:
Проверка правил судоку
Чтобы сетка судоку считалась решенной, она должна соответствовать некоторым ограничениям:
- Каждая строка, составляющая сетку, должна содержать все цифры от 1 до 9.
- Каждый столбец, составляющий сетку, должен содержать все цифры от 1 до 9.
- Каждые девять подсеток 3x3, составляющие сетку, должны содержать все цифры от 1 до 9.
Итак, после каждого шага нашего алгоритма обратного отслеживания мы будем проверять, остается ли сетка действительной или нет. Если да, мы продолжим пробовать другие назначения для других ячеек сетки. В противном случае мы попробуем новое значение для текущей ячейки.
Реализация проверки этих 3-х правил сделана так:
Реализация алгоритма обратного отслеживания
Как поясняют в Википедии:
Отслеживание с возвратом - это общий алгоритм для поиска всех (или некоторых) решений некоторых вычислительных проблем, в частности проблем удовлетворения ограничений, который постепенно создает кандидатов для решений и оставляет кандидата ( backtracks ), как только он определит, что кандидат не может быть доработан до действительного решения.
В нашем классе Sudoku мы создаем метод solution для реализации этого алгоритма. В нашей реализации мы остановим алгоритм после того, как будет найдено одно решение. Это хорошо, потому что правильная сетка судоку имеет уникальное решение.
Мы выполняем итерацию по сетке, а затем пытаемся присвоить значение пустой ячейке. Если сетка правильная после этого назначения, мы рекурсивно вызываем метод resolve и возвращаем true
. В противном случае мы возвращаем false
, а затем алгоритм может попробовать другое назначение для текущей ячейки.
Этот рекурсивный подход дает нам следующий полный код для нашего класса судоку:
В конце занятия вы должны были отметить наличие метода display, который используется для отображения сетки на экране в режиме консоли.
Наш решатель судоку в действии!
Последний шаг - запустить наш Решатель Судоку в действии!
Мы вводим сетку для решения, а затем вызываем метод решения в основной точке входа нашего класса. Как только разрешение будет выполнено, на экране должен появиться следующий результат с решенной сеткой:
Идти дальше
Вот и все для этого урока. В следующем уроке вы узнаете, как создать более умный решатель судоку с помощью алгоритма танцующей ссылки.
В ожидании этого урока, почему бы не поиграть в судоку напрямую на Android-устройстве? Вы можете бесплатно попробовать это приложение для Android судоку в магазине Google Play:
Если у вас есть вопросы по этому руководству, не стесняйтесь использовать раздел комментариев ниже.
Если вы хотите открыть для себя книги по изучению программирования на Java, я советую вам прочитать следующую статью с моей подборкой из 6 лучших книг по программированию на Java:
Другие статьи о Java, которые могут вам понравиться
Дорожная карта для разработчиков Java
10 вещей, которые должны изучить Java и веб-разработчики
10 инструментов тестирования, которые следует изучить разработчикам Java. Знайте
5 фреймворков, которые должны изучить Java-разработчики
5 курсов по изучению больших данных и Apache Spark на Java
10 курсов по DevOps для разработчиков Java
10 книг, которые должен прочитать каждый Java-программист
10 инструментов, которые Java-разработчики используют в своей повседневной работе
10 советов, как стать лучшим Java-разработчиком
Хотите большего? Вот и другие наши лучшие статьи для чтения