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]);
  }
}

我计算出所有比赛都可以进行两次(同时获得 As,Ah vs Kc,Kd 和 Kc,Kd vs 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

您的代码打印了正确的结果,但没有正确地遍历所有卡片。a并且c应该循环到 52。额外的手需要用一个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 回答