1

52C2 * 50C2 / 2 = 812175ホールデムでは直接対戦する可能性があります。各カードに配列があると仮定すると、これらすべてのマッチアップを列挙するにはどうすればよいでしょうか?

たとえば、考えられるすべてのスターティング ハンドを列挙するには、次のようにします。

for (int a = 0; a < 51; ++a) {
  for (int b = a + 1; b < 52; ++b) {
    println(cards[a] + "," + cards[b]);
  }
}

私は、すべてのマッチアップを2回行うことができると考えました(As、Ah対Kc、KdとKc、Kd対As、Ahの両方を取得します):

long total = 0;
for (int a = 0; a < 51; ++a) {
  for (int b = a + 1; b < 52; ++b) {
    for (int c = 0; c < 51; ++c) {
      for (int d = c + 1; d < 52; ++d) {
        total++;
      }
    }
  }
}
4

1 に答える 1

0

コードは正しい結果を出力しますが、すべてのカードを正しく反復しません。a52 までループする必要があります。余分な手は次のステートメントcで削除する必要があります。if

for (int a = 0; a < 52; ++a) {
  for (int b = a + 1; b < 52; ++b) {
    for (int c = 0; c < 52; ++c) {
      for (int d = c + 1; d < 52; ++d) {
        if (c != a && c != b && d != a && d != b) {
          total++;
        }
      }
    }
  }
}

これを変更して、重複した手を削除できます。

for (int a = 0; a < 52; ++a) {
  for (int b = a + 1; b < 52; ++b) {
    for (int c = a + 1; c < 52; ++c) {
      for (int d = c + 1; d < 52; ++d) {
        if (c != b && d != b) {
          total++;
        }
      }
    }
  }
}
于 2012-12-17T23:54:48.823 に答える