Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- void Perestanovka(int *a, int i, int j) { // данная функция меняет значения двух элементов
- int buff = a[i];
- a[i] = a[j];
- a[j] = buff;
- }
- bool Step(int *a, int n) { // данная функция генерирует комбинации и возвращает булево значение (false - если комбинаций не осталось, true - наоборот)
- int j = n - 2;
- while ((j != -1) && (a[j] > a[j + 1])) {
- j--;
- }
- if (j == -1) {
- return false;
- }
- int k = n - 1;
- while (a[j] >= a[k]) {
- k--;
- }
- Perestanovka(a, j, k); // устанавливают два элемента в порядке убывания (строки 12-23)
- int l = j + 1, r = n - 1;
- while (l < r) {
- Perestanovka(a, l++, r--);
- } // устанавливают все элементы, находящиеся справа от изменненных выше в порядке возрастания (строки 24-28)
- return true;
- }
- void VivodKomb(int *a, int n) { // данная функция выводит соответствующую условию перестановку
- static int st = 1; // порядковый номер комбинации, которая соответствует условию задачи
- int i = 0;
- while ( i <= n) {
- if (i+1 == a[i]) { // если найден элемент номер которого соответствует его значению, то комбинация выводится на экран и функция завершает свою работу
- cout << st++ << ": ";
- for (int i = 0; i < n; i++) {
- cout << a[i] << " ";
- }
- cout << endl;
- break;
- }
- else {
- i++;
- }
- }
- }
- int main()
- {
- setlocale(LC_ALL, "");
- int n, i;
- cout << "Введите количество шариков:\n";
- cin >> n;
- int *a = new int[n]; // создаем динамический массив;
- for (i = 0; i < n; i++) {
- a[i] = i+1;
- }
- cout << "Комбинации соответствующие условию задачи:\n";
- VivodKomb(a, n); // Выводим самую первую комбинацию, так как она в любом случае соответствует условию
- while (Step(a, n)) {
- VivodKomb(a, n);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement