首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog:从哪里开始解决扫雷类的难题?

Prolog:从哪里开始解决扫雷类的难题?
EN

Stack Overflow用户
提问于 2012-04-02 20:16:06
回答 1查看 1.5K关注 0票数 3

我需要写点像普罗洛格号的扫雷车。我可以用“普通”语言来做这件事,但是当我尝试用prolog开始编码时,我完全不知道如何开始。我需要一些提示。输入规范:

板大小:m×n (m,n∈{1,...,8}),三元组列表(i,j,k),其中i∈{1,…,m},j∈{1,…,n},k∈{1,...,8})。

例如:

代码语言:javascript
复制
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个领域里有隐藏的宝藏。字段中的数字代表有多少相邻字段有一个宝藏。在有数字的田野里没有宝藏。用宝物标记所有的田地。

你需要猜出有多少宝藏隐藏在对角线上。

如有任何建议,我将不胜感激。我不想要完全的解决方案,我想自己写,但没有线索,我无法做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-02 21:11:53

矩阵通常作为列表处理,可以使用length/2和findall/3构建。

代码语言:javascript
复制
build_matrix(NRows, NCols, Mat) :-
  findall(Row, (between(1, NRows, _), length(Row, NCols)), Mat).

通过坐标访问元素可以使用nth1完成(另一个答案请参见here,在这里您可以找到一些细节:参见单元格/3)。

然后,放置所有的三重限制:有有限的方式消费‘隐藏的宝藏’计数器,让Prolog搜索所有的方式,列举邻接。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9983206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档