我遇到了一个特殊的问题,我似乎无法绕过头脑。我会直接进入它。
问题是将一组牌与一组规则相匹配。
可以将一组规则定义为字符串。它由逗号分隔的<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
。
Matched: H:8
Matched: H:8, H:4
我不希望这组卡被命令对结果产生任何影响,就像在上面的例子中那样。如果我能想出任何适用于任何一套规则的好策略,我就可以对这组牌进行排序。
我不知道卡的数量或规则的数量,所以蛮力方法是不可行的。
感谢您阅读本文,我很感激任何提示或见解。
答案 0 :(得分:-2)
您的问题实际上是一个订购问题。这是一个简单的版本:
给定数字和模式的输入序列,重新排序它们以使它们适合模式。该模式可以包含“*”,意思是“任意数字”和“&gt;”,意思是“大于之前的数字。”
例如,给定模式[* *&gt; &gt;]和序列[10 10 2 1]存在这样的排序,它是[10 1 2 10]。有些输入可能没有输出,有些输入可能没有输出,有些输入也很多(想想输入[10 10 2 1]和模式[* * * *])。
我会说,一旦你有了这个简化问题的解决方案,切换到你的问题只是添加另一个维度和一些运算符的问题。很抱歉没有更多的帮助:/。
LE。请记住,如果允许的字符符号是有限的(即4),并且允许的数字(即9),事情可能会变得更容易。