我需要在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个区域中有隐藏的宝藏。字段中的数字表示有多少邻居字段有宝藏。有数字的领域没有宝藏。用宝藏标记所有领域。
您需要猜测在对角线中隐藏了多少宝藏。
我会很感激任何提示。我不想完全解决,我想自己写,但没有线索,我无法做到。
答案 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一路搜索,列举邻居。
使用递归谓词处理三元组列表,将每个计数器放在兼容的单元格中。当列表结束时,你有一个猜测。
为了使代码更简单,不要担心索引超出矩阵范围,请记住在搜索时失败是“正常的”...