3

私は、2人のプレーヤーがそれぞれ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...

シードは関係ありません...値だけが関係します。しかし、問題は、一意の組み合わせを計算する必要があることです。したがって、たとえば、シードと値が同じであるため、これらのコンボの1つだけが必要です。

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

これを行うための既成の関数はありますか?グーグルとウィキペディアを見て回ってみましたが、おそらく英語でのアルゴリズム/問題の名前がわかりません。ああ...私は忘れていました...解決策はあなたが望むものなら何でもかまいません(プレーン、再帰、linq)。

4

1 に答える 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)

これは概念的には束 3B の Knuth のアルゴリズム P に似ています。

于 2013-01-22T11:37:42.660 に答える