Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- bool next_combination(vector<int> &a, int n) { //следующая комбинация C<n,a.size()>
- for (int i = a.size() - 1; i >= 0; i--)
- if (a[i] < n - a.size() + i + 1) { //пытаемся увеличить каждый элемент
- a[i]++; //начиная с последнего
- for (int j = i + 1; j < a.size(); j++) //каждый элемент справа от измененного
- a[j] = a[j - 1] + 1; //меняем на элемент, на 1 больший левого
- return true; //если нашелся элемент, который можно увеличить,
- } // возвращается true, и измененный массив
- return false; //если не нашелся такой элемент, возвращается false
- }
- void reset_vector(vector<int> &a) { //сброс вектора до первой комбинации {1, 2, 3}
- a[0] = 1, a[1] = 2, a[2] = 3; //в нашей задаче меняются всегда по 3 книги,
- } //поэтому все массивы по 3 элемента
- int main() {
- vector<int> first(3), second(3); //обмениваемые книги 1 и второго человека
- int n = 7, m = 9; //у первого n = 7 книг, у второго m = 9 книг
- reset_vector(first); //сбросим комбинацию обмениваемых книг на первую лексиграфическую
- reset_vector(second); //у обоих людей
- do { // do-while в ситуации с имеющейся функцией проверки и предоставления
- do { // следующей комбинации подходит идеально и сильно удобнее обычного while
- cout << "first: " << first[0] << ' ' << first[1] << ' ' << first[2] << ", "; //вывод текущих
- cout << "second: " << second[0] << ' ' << second[1] << ' ' << second[2] << endl; //комбинаций
- } while (next_combination(second, m)); //получение следующей комбинации 2 человека, при наличии
- reset_vector(second); //если мы тут, значит у второго человека кончились комбинации, сбросим до 1
- } while (next_combination(first, n)); //получение следующей комбинации 1 человека, при наличии
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement