卡牌游戏算法:独特组合的解决方案

3

我正在编写一个小型纸牌游戏,其中两名玩家手中各有4张牌,并且他们必须根据点数尽可能多地拿走桌子上的牌。使用的是经典扑克牌,因此花色和点数相同。

King can only take another King
Queen can only take another Queen 
Jack can only take another Jack

数字卡片可以通过求和来获取,例如:

10H takes 6C + 4S
5S takes 3C + 2D or 3S + 2D
7S takes 4S + 3S or 5C + 2D
And so on...

种子不重要,只有值才重要。但问题在于我需要计算唯一的组合。例如,我只想要那些种子和值完全相同的组合中的一个:

10H -> 6C + 4S
10H -> 4S + 6C

有没有预先制作的函数来完成这个任务?我试着在谷歌和维基百科上搜索,但可能我不知道这个算法/问题在英语中的名称。哦...我忘了...解决方案可以是任何你想要的(简单的、递归的、linq)。
1个回答

2
您想要计算的组合被称为整数划分。因此,您需要一个整数划分算法
Python中的解决方案可能如下所示:
def bubble(part, i=0): #add one to the list whilst keeping lexicographic order
    if i == (len(part)-1) or part[i] < part[i+1]:
        part[i] += 1
        return part
    else:
        return bubble(part, i+1)

def partitions(n):
    if n == 1:
        yield [1]
        return
    for p in partitions(n-1):
        yield [1] + p
        yield bubble(p)

这在概念上类似于 Knuth 的 算法 P(3B册)

看起来是的,但没有maxCount限制。 - Tommaso Belluzzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接