序言中的飞镖得分

问题描述 投票:0回答:1

我正在尝试解决明天要在Prolog中完成的任务。这是关于飞镖游戏的,程序应该计算出一种方法,可以通过三次飞镖投掷达到输入分数。

输入程序应该是整数n(1-180),并且是目标分数。

输出应该是(最多可以)达到输入分数(最多三投)的一种方法。换句话说,累计点的总和应等于输入整数n。就像在游戏中一样,每次投掷可以是一次,两次或三次。 Bullseyes不是问题的一部分。如果无法达到目标分数,则应打印“不可能”。

例如:

Input: 180 
Output: triple 20, triple 20, triple 20
Input: 96
Output: triple 19, double 15, single 9
Input: 27
Output: triple 9

有人对好的方法有想法吗?代码片段受到热烈的欢迎,因为我是逻辑编程的新手。 :)

dart prolog logic swi-prolog
1个回答
0
投票

指针:

您要搜索特定的解决方案[X,Y,Z],其中从允许的飞镖得分中选择X,Y,Z(我不知道是哪个。例如30,20,10)。

  • 简单的问题?清单是您的朋友。解决方案应为清单[X,Y,Z]。分数应为列表[30,20,10]
  • 立即抛出三遍,立即摆脱特殊情况并允许特殊分数为0,例如[30,0,0][20,10,0][10,10,10]都还可以。
  • 通过说明,将可能的解决方案收集到等价类中无论发生什么,最大的分数排在第一位。 [30,0,0][0,30,0][0,0,30]全部都收集到同一个等效类中,用单个[30,0,0]表示。

现在...

使用“对整数进行约束逻辑编程”还是“普通序言”?

两者都很好,但是CLP(FD)很好。

对于“普通Prolog”,您只需要知道Prolog处理器如何处理程序。使用“生成并测试”方法,搜索空间不大。 member/2Score =:= X + Y + Z是你的朋友。

一行!去,去,去!

© www.soinside.com 2019 - 2024. All rights reserved.