首先,我并不是一定要找一个可以复制粘贴的完整算法,然后就可以收工了。任何“一般的方法”解决方案都对我来说没问题!
这篇文章的灵感来源于工作中无聊的一天,偶然发现这个网站,但却无法弄清他们是如何实现他们的生成器的。
问题
对于那些不知道的人来说,“斑马难题”或“爱因斯坦难题”是一道著名的逻辑谜题,你可能以前就遇到过。
完整的维基百科文章在这里,但我会发布相关的部分。
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.
这些方法看起来都很不错。我在网上找到了几种简洁而整洁的方法来解决这个问题,特别是使用约束编程。但是,我感兴趣的是制作更多这样的谜题。
制作更多
显然,矩阵表示法是思考这个问题的一种逻辑方式。每列包含一个人、房子、他们喝什么、他们开什么车等信息。
我最初的想法是从已完成(即已解决)的随机生成方格开始(以某种方式)创建提示,然后从已解决的版本中唯一地识别它。每次可以确定某些东西时,它就会从方格中删除。
从我在开头列出的网站上翻译过来的以下“提示”可用于解决网格:
-
人/动物/植物住/生长在给定的房子里。
-
人/动物/植物不住/生长在给定的房子里。
-
人/动物/植物住在同一个房子里
-
人/动物/植物是另一个人/动物/植物的直接邻居。
-
人/动物/植物是其他人/动物/植物的左边或右边的邻居。
-
人/动物/植物和另一个人/动物/植物之间有一座房子。
-
人/动物/植物和另一个人/动物/植物之间有一座房子,左边或右边。
-
人/动物/植物和另一个人/动物/植物之间有两个房子。
-
人/动物/植物和另一个人/动物/植物之间有两个房子,左边或右边。
-
人/动物/植物住在离其他人/动物/植物左侧或右侧的位置。
您可以看到如何将这些广义化、扩展等;
困难在于,使用我的方法(从完整的方格开始并生成这些提示),我不确定如何确保我创建的提示集会绝对导致目标方格。
例如,如果你说“英国人不拥有松树”,你不能在任何给定时间决定性地配对两个东西。但是,如果只剩下两棵树需要解决,这实际上可能是一个决定性的证据。
我想错了吗?更好的方法是创建一个具有一些随机预定义已知元素的方格(即红房子在中间),然后使用这些提示作为构建规则来构建方格吗?
非常感谢任何建议、阅读文章、学习编程技术等!