4

ポーカーのダブルガターは、ストレートに2ガットショットがある場合です。

たとえば、ボードが268で、45がある場合、3(23456)または7(45678)がストレートを完了します。

board[]とhand[]が与えられた場合、二重ガターがある場合はtrueを返し、そうでない場合はfalseを返すための効率的なアルゴリズムは何ですか?

4

3 に答える 3

1

これをビットベクトルで実行できるアルゴリズムを次に示します。

最初に、たとえば 14 ビットのビット ベクトルを作成し(ロー エースとハイ エースを含める)、とcardsの各要素の各ビットを設定します。hand[]board[]

次に、ダブル ガターがある場合のよう(mask, gutter)に、最初の要素に対して5 組のマスクを生成します。たとえば、カードの 1 つが の場合、ペアは次のようになります (MSB->LSB の順序を仮定):hand[]((cards & mask) ^ gutter)==07(mask, gutter)

01111111000000, 01011101000000
00000001111111, 00000001011101
00000111111100, 00000101110100
00001111111000, 00001011101000
00011111110000, 00010111010000

つまり、両端に 7 の 2 つの二重ガターと、中央に 7 の 3 つの二重ガターがあります。

((cards & mask) ^ gutter)次に、 5 つのペアのそれぞれについて計算します。もしあれば、0あなたは二重溝を持っています。

編集:5つのマスクをテストするだけでよいことがわかりました。

于 2013-01-28T04:14:15.977 に答える
0

私の推測:

  1. カード値ごとにbool配列(またはビットフィールド)を作成します
  2. board[]およびhand[]内のすべてのカードについて、対応するエントリをtrueに設定します
  3. ストレートのすべての可能性を確認してください。あなたは色を気にしないので、オプションは非常に限られています(すなわち、23456、34567など)-可能なストレートからちょうど1枚のカードが欠落している場合は、それをセットに追加します(重複を含めることはできません)。
  4. セットに正確に2つのエントリが含まれている場合は、trueを返します。

または、まだボード上にない値に対して1つの実験を行い、その値を追加した場合にストレートがあるかどうかを確認し、これが発生した値を数えます。

すべてのアルゴリズムは一定時間であり(全体の状況が限られているため)、それほど大きな労力はかかりません。

于 2013-01-28T04:07:12.777 に答える
0

ビット単位の操作を使用した私のアプローチは次のとおりです。

vec = 0

hand[]board[]を数値のビットにマップしvec、次に

gutter = 0
for i = 0 to 10
    x = (vec & 0x1f) ^ 0x1f
    if x one of 1,2,4,8,16
        gutter++
        if gutter >= 2
            return true
    vec = vec >> 1
return false
于 2013-01-28T17:12:28.310 に答える