Все для кортежей
Я пытаюсь решить судоку с точки зрения, что каждое число имеет 9 позиций. Это представление для моей судоку:
Из таблицы видно, что число 5 имеет следующие позиции (строка, столбец) в судоку: (2,8),(4,2),(6,5).
Когда я упоминаю строку в своем объяснении, я имею в виду такую строку:
Например, приведенная выше строка является строкой 1.
Я сделал следующее:
- Для каждой строки проверьте, все ли значения ROW в этой строке отличаются, используя
alldifferent
отic_global
, - Сделайте то же самое, что и выше, но затем для значений COLUMN.
- Для каждой строки проверьте, отличаются ли квадратные числа (рассчитывается каждый раз с использованием значения строки и столбца), используя
alldifferent
снова.
Вышеуказанные вещи работают хорошо, и я получаю решение для судоку, но не правильное. Это потому, что я должен проверить еще одну вещь: каждая позиция должна быть разной. С текущим состоянием моего решателя я мог бы получить решение с несколькими числами в одной и той же позиции, например, 2 и 3 могут быть в позиции (5,7), потому что я не проверяю, все ли позиции разные.
Как бы я решил эту проблему? Я попытался получить ВСЕ позиции в одном списке в форме кортежей, а затем проверить, все ли кортежи разные, но я боролся часами, и я действительно отчаялся. Я надеюсь, что смогу найти решение здесь.
РЕДАКТИРОВАТЬ: Добавлен код
1 ответ
Как ты уже знаешь, all_different/1
и связанные ограничения работают на целых числах. Кроме того, в вашем случае вас на самом деле интересует особый случай кортежей, а именно пар, состоящих из строк и столбцов.
Итак, ваш вопрос может быть сведен к:
Как я могу инъективно отобразить пары целых чисел на целые числа?
Предположим, у вас есть пары вида A-B
где оба A
а также B
ограничены 1..9
,
Я могу поместить такие пары в однозначное соответствие целым числам несколькими способами. Это очень простая функция: 9 × A + B. Думаю об этом!
Таким образом, я рекомендую вам сопоставить такие позиции с целыми числами таким же или аналогичным образом, а затем опубликовать all_different/1
на эти целые числа.
Упражнение: подумайте о других возможных отображениях и их свойствах. Затем обобщите их для работы с кортежами.