Prolog:从哪里开始解决类似扫雷的谜题?

时间:2012-04-02 20:16:07

标签: prolog puzzle

我需要在prolog中写一些类似扫雷的东西。我能用“普通”语言做到这一点,但当我尝试用prolog开始编码时,我完全不知道如何开始。 我需要一些提示。 输入规范:

电路板尺寸: m × n m n ∈{1,...,16 }),三元组列表( i j k ),其中 i ∈{1,.. 。, m }, j ∈{1,..., n }, k ∈{1, ...,8})用数字描述字段。

例如:

5
5
[(1,1,1), (2,3,3), (2,5,2), (3,2,2), (3,4,4), (4,1,1), (4,3,1), (5,5,2)].

输出:数字列表和原子*(用于宝藏)和(用于空白字段)。它是拼图解决方案的代表。

这个难题的规则: 在一块板的20个区域中有隐藏的宝藏。字段中的数字表示有多少邻居字段有宝藏。有数字的领域没有宝藏。用宝藏标记所有领域。

您需要猜测在对角线中隐藏了多少宝藏。

我会很感激任何提示。我不想完全解决,我想自己写,但没有线索,我无法做到。

1 个答案:

答案 0 :(得分:1)

矩阵通常作为列表列表处理,您可以使用length / 2和findall / 3进行构建。一个空变量矩阵(你猜测时会放置值......)

build_matrix(NRows, NCols, Mat) :-
  findall(Row, (between(1, NRows, _), length(Row, NCols)), Mat).

通过坐标访问元素可以使用nth1完成(请参阅here获取另一个答案,您可以在其中找到一些细节:参见cell / 3)。

然后你放置了所有三元组的约束:消耗“隐藏的宝藏”计数器的方式有限,让Prolog一路搜索,列举邻居。

使用递归谓词处理三元组列表,将每个计数器放在兼容的单元格中。当列表结束时,你有一个猜测。

为了使代码更简单,不要担心索引超出矩阵范围,请记住在搜索时失败是“正常的”...