将卡与一组规则匹配的算法

时间:2012-08-21 19:09:43

标签: algorithm match playing-cards

我遇到了一个特殊的问题,我似乎无法绕过头脑。我会直接进入它。

问题是将一组牌与一组规则相匹配。

可以将一组规则定义为字符串。它由逗号分隔的<suit>:<value>元组组成。例如H:4, S:1应该匹配四个心脏和黑桃王牌。也可以使用通配符,例如*:*匹配任何卡片,D:*匹配钻石套装中的任何卡片,*:2匹配任何套装中的两张卡片。规则可以与逗号结合使用:*:*,*:*,H:4如果持有2张随机牌和4张心牌,则会匹配一组牌。

到目前为止一切顺利。解析器可以轻松直接地编写。这是棘手的部分。

为了便于组成这些规则,可以使用另外两种结构来实现套装和价值。这些是<(法律适用于诉讼和价值)和+n(仅适用于价值),其中n是数字。 <表示“与之前的匹配相同”,+n表示“n比之前的匹配高”。一个例子:

*:*, <:*, *:<

意思是:匹配任何一张牌,然后匹配一张与第一场比赛同一套牌的牌,然后匹配另一张牌与第二场比赛相同的牌。这只手会匹配:

H:4,H:8,C:8

因为四心八和八心之心是同一套,而八心和八俱乐部是相同的价值。

只要所有规则都匹配,就可以拥有更多的卡片(因此,将C:10添加到上面的手中仍然会匹配规则)。

我解决这个问题的第一个方法是基本上采用应该匹配的卡片组,试图将第一个规则应用于它。如果它匹配,我转到下一个规则,并尝试从卡组匹配,依此类推,直到所有规则都匹配,或者我找到了一个不匹配的规则。这种方法有(至少)一个缺陷,考虑上面的例子:*:*,<:*,*:<,但按照这个顺序排列:H:8,C:8,H:4

  • 它符合第一条规则的H:8。 Matched: H:8
  • 接下来,它试图找到一个同样的西装(红心)。有四颗心。 Matched: H:8, H:4
  • 继续前进,它想找到一张价值相同的卡(四张),然后失败。

我不希望这组卡被命令对结果产生任何影响,就像在上面的例子中那样。如果我能想出任何适用于任何一套规则的好策略,我就可以对这组牌进行排序。

我不知道卡的数量或规则的数量,所以蛮力方法是不可行的。

感谢您阅读本文,我很感激任何提示或见解。

1 个答案:

答案 0 :(得分:-2)

您的问题实际上是一个订购问题。这是一个简单的版本:

给定数字和模式的输入序列,重新排序它们以使它们适合模式。该模式可以包含“*”,意思是“任意数字”和“&gt;”,意思是“大于之前的数字。”

例如,给定模式[* *&gt; &gt;]和序列[10 10 2 1]存在这样的排序,它是[10 1 2 10]。有些输入可能没有输出,有些输入可能没有输出,有些输入也很多(想想输入[10 10 2 1]和模式[* * * *])。

我会说,一旦你有了这个简化问题的解决方案,切换到你的问题只是添加另一个维度和一些运算符的问题。很抱歉没有更多的帮助:/。

LE。请记住,如果允许的字符符号是有限的(即4),并且允许的数字(即9),事情可能会变得更容易。