How can I iterate through every possible combination of n playing cards

前端 未结 4 1247
别那么骄傲
别那么骄傲 2020-12-04 02:56

How can I loop through all combinations of n playing cards in a standard deck of 52 cards?

4条回答
  •  [愿得一人]
    2020-12-04 03:41

    #include 
    #include 
    using namespace std;
    
    class CombinationsIndexArray {
        vector 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 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;
    }
    

    Output:

    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
    

提交回复
热议问题