如何在一副标准的 52 张纸牌中循环遍历 n 张纸牌的所有组合?
最佳答案
您需要 n
的所有组合一组 N
中的项目项目(在你的情况下, N == 52
,但我会保持通用的答案)。
每个组合都可以表示为一个项目索引数组,size_t item[n]
,这样:
-
0 <= item[i] < N
-
item[i] < item[i+1]
, 因此每个组合都是一个独特的子集。
以 item[i] = i
开头.然后迭代到下一个组合:
- 如果最终索引可以增加(即
item[n-1] < N-1
),那么就这样做。 - 否则,向后工作直到找到可以递增的索引,并且仍然为以下所有索引留出空间(即
item[n-i] < N-i
)。增加它,然后将以下所有索引重置为可能的最小值。 - 如果您找不到任何可以递增的索引(即
item[0] == N-n
),那么您就完成了。
在代码中,它可能看起来像这样(未经测试):
void first_combination(size_t item[], size_t n)
{
for (size_t i = 0; i < n; ++i) {
item[i] = i;
}
}
bool next_combination(size_t item[], size_t n, size_t N)
{
for (size_t i = 1; i <= n; ++i) {
if (item[n-i] < N-i) {
++item[n-i];
for (size_t j = n-i+1; j < n; ++j) {
item[j] = item[j-1] + 1;
}
return true;
}
}
return false;
}
让它更通用,看起来更像 std::next_permutation
可能会更好,但这是一般的想法。
关于c++ - 我如何遍历 n 扑克牌的所有可能组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5076695/