Advertisement
DrBoat

Untitled

Jan 23rd, 2020
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. bool next_combination(vector<int> &a, int n) { //следующая комбинация C<n,a.size()>
  7.     for (int i = a.size() - 1; i >= 0; i--)
  8.         if (a[i] < n - a.size() + i + 1) { //пытаемся увеличить каждый элемент
  9.             a[i]++;                        //начиная с последнего
  10.             for (int j = i + 1; j < a.size(); j++) //каждый элемент справа от измененного
  11.                 a[j] = a[j - 1] + 1;               //меняем на элемент, на 1 больший левого
  12.             return true; //если нашелся элемент, который можно увеличить,
  13.         }                // возвращается true, и измененный массив
  14.     return false; //если не нашелся такой элемент, возвращается false
  15. }
  16.  
  17. void reset_vector(vector<int> &a) { //сброс вектора до первой комбинации {1, 2, 3}
  18.     a[0] = 1, a[1] = 2, a[2] = 3; //в нашей задаче меняются всегда по 3 книги,
  19. }                                 //поэтому все массивы по 3 элемента
  20.  
  21. int main() {
  22.     vector<int> first(3), second(3); //обмениваемые книги 1 и второго человека
  23.     int n = 7, m = 9; //у первого n = 7 книг, у второго m = 9 книг
  24.     reset_vector(first);  //сбросим комбинацию обмениваемых книг на первую лексиграфическую
  25.     reset_vector(second); //у обоих людей
  26.  
  27.     do {      // do-while в ситуации с имеющейся функцией проверки и предоставления
  28.         do {  // следующей комбинации подходит идеально и сильно удобнее обычного while
  29.             cout << "first: " << first[0] << ' ' << first[1] << ' ' << first[2] << ", ";      //вывод текущих
  30.             cout << "second: " << second[0] << ' ' << second[1] << ' ' << second[2] << endl;  //комбинаций
  31.         } while (next_combination(second, m)); //получение следующей комбинации 2 человека, при наличии
  32.         reset_vector(second);  //если мы тут, значит у второго человека кончились комбинации, сбросим до 1
  33.     } while (next_combination(first, n)); //получение следующей комбинации 1 человека, при наличии
  34.  
  35.     return 0;
  36. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement