Все для кортежей

Я пытаюсь решить судоку с точки зрения, что каждое число имеет 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 на эти целые числа.

Упражнение: подумайте о других возможных отображениях и их свойствах. Затем обобщите их для работы с кортежами.

Другие вопросы по тегам