c++ - 我如何遍历 n 扑克牌的所有可能组合

标签 c++ playing-cards

如何在一副标准的 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/

相关文章:

c++ - Cmake 找不到使用 "link_directories"的库

encryption - P2P纸牌游戏的密码学

java - 纸牌游戏中的玩家顺序

java - 计算枚举总值 Java

使用链表创建一副牌

c++ - 当我们将数据从 ax 移动到端口地址时会发生什么

c++ - 使用另一个线程停止 scanf 等待输入

c++ - TreeView 捕获展开(或折叠)消息?

ruby - 初始化一副纸牌的更好方法

c++ - 如何在OpenGL中更新 "forward"运动