如何迭代n种扑克牌的每种可能组合

时间:2011-02-22 10:04:31

标签: c++ playing-cards

如何在52张牌的标准套牌中循环播放n张扑克牌的所有组合?

3 个答案:

答案 0 :(得分:2)

您需要来自一组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可能会更好,但这是一般的想法。

答案 1 :(得分:-1)

我发现这个问题与电源设置问题基本相同。请参阅Problems with writing powerset code以获得优雅的解决方案。

答案 2 :(得分:-1)

#include <iostream>
#include <vector>
using namespace std;

class CombinationsIndexArray {
    vector<int> index_array;
    int last_index;
    public:
    CombinationsIndexArray(int number_of_things_to_choose_from, int number_of_things_to_choose_in_one_combination) {
        last_index = number_of_things_to_choose_from - 1;
        for (int i = 0; i < number_of_things_to_choose_in_one_combination; i++) {
            index_array.push_back(i);
        }
    }
    int operator[](int i) {
        return index_array[i];
    }
    int size() {
        return index_array.size();
    }
    bool advance() {

        int i = index_array.size() - 1;
        if (index_array[i] < last_index) {
            index_array[i]++;
            return true;
        } else {
            while (i > 0 && index_array[i-1] == index_array[i]-1) {
                i--;
            }
            if (i == 0) {
                return false;
            } else {
                index_array[i-1]++;
                while (i < index_array.size()) {
                    index_array[i] = index_array[i-1]+1;
                    i++;
                }
                return true;
            }
        }
    }
};

int main() {

    vector<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);
    a.push_back(5);
    int k = 3;
    CombinationsIndexArray combos(a.size(), k);
    do  {
        for (int i = 0; i < combos.size(); i++) {
            cout << a[combos[i]] << " ";
        }
        cout << "\n";
    } while (combos.advance());

    return 0;
}

输出:

1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5