Во-первых, я не обязательно ищу полный алгоритм, который я могу просто скопировать и вставить, а затем называть его днем. Любые решения "общего подхода" были бы хороши для меня!
Весь этот пост был вызван медленным рабочим днем и наткнулся на этот сайт и не смог понять, как они реализовали свой генератор.
Проблема
Для тех из вас, кто не знает, "Zebra Puzzle" или "Einstein Puzzle" - это знаменитая логическая головоломка, с которой вы, вероятно, столкнулись раньше.
Полная статья wiki здесь, но я буду публиковать соответствующие биты.
There are five houses.
The Englishman lives in the red house.
The Spaniard owns the dog.
Coffee is drunk in the green house.
The Ukrainian drinks tea.
The green house is immediately to the right of the ivory house.
The Old Gold smoker owns snails.
Kools are smoked in the yellow house.
Milk is drunk in the middle house.
The Norwegian lives in the first house.
The man who smokes Chesterfields lives in the house next to the man with the fox.
Kools are smoked in the house next to the house where the horse is kept.
The Lucky Strike smoker drinks orange juice.
The Japanese smokes Parliaments.
The Norwegian lives next to the blue house.
Now, who drinks water? Who owns the zebra? In the interest of clarity, it must be
added that each of the five houses is painted a different color, and their inhabitants
are of different national extractions, own different pets, drink different beverages
and smoke different brands of American cigarets [sic]. One other thing: in statement
6, right means your right.
Это хорошо и хорошо. Я нашел несколько кратких и опрятных способов онлайн для решения этой проблемы, особенно с использованием программирования ограничений. Тем не менее, меня интересует то, что вы делаете больше таких головоломок.
Создание большего количества
Очевидно, что представление матрицы является логическим способом думать об этом. С каждой колонкой, содержащей человека, дом, то, что они пьют, какой тип автомобиля они приводят и т.д.
Моя первоначальная мысль заключалась в том, чтобы начать с случайно созданной сетки, которая является полной (т.е. решена), затем (каким-то образом) создает подсказки из решенной версии, которые однозначно идентифицируют ее. Каждый раз, когда что-то можно определить, он удаляется из сетки.
Сбрасывая сайт, который я перечислял в начале, следующие "подсказки", которые могут быть использованы для решения сетки, могут иметь следующий тип:
-
Человек/животное/растение живет/растет в данном доме.
-
Человек/животное/растение не живет/растёт в данном доме.
-
Человек/животное/растение живет в том же доме, что и другой человек/животное/растение.
-
Человек/животное/растение является прямым соседом другого человек/животное/растение.
-
Человек/животное/растение - левый или правый сосед другого человек/животное/растение.
-
Существует один дом между человеком/животным/растением, а другой человек/животное/растение.
-
Существует один дом между человеком/животным/планом, а другой человек/животное/растение слева или справа.
-
Есть два дома между человеком/животным/растением, а другой человек/животное/растение.
-
Есть два дома между человеком/животным/планом, а другой человек/животное/растение слева или справа.
-
Человек/животное/растение живет слева или справа от другого человек/животное/растение.
Вы можете видеть, как они могут быть обобщены, расширены и т.д.
Трудность заключается в использовании моего подхода (начиная с полной сетки и генерируя эти подсказки), я не уверен, как убедиться, что набор намеков, которые я создаю, абсолютно приведет к целевой сетке.
Например, если вы говорите: "У англичанина нет соснового дерева", вы не можете решительно соединить две вещи вместе в любой момент времени в головоломке. Тем не менее, если бы осталось только два дерева, которые могли бы решить, это могло бы стать решающим доказательством.
Я думаю об этом совершенно неправильно? Лучше ли было бы создать сетку с некоторыми рандомизированными заранее определенными элементами (т.е. Красный дом посередине), а затем построить сетку, используя эти подсказки в качестве правил построения?
Приветствуются любые советы, статьи для чтения, методы программирования, и т.д.