Помогите с программой на Си++

264
02 апреля 2017, 04:44

Нашел программу для выполнения задачи размещения без перестановки, но не могу понять, как работает сам алгоритм, можете объяснить ?

#include <iostream>
using namespace std;
void swap(int* a, int i, int j)
{
    int s = a[i];
    a[i] = a[j];
    a[j] = s;
}
bool NextSet(int* a, int n, int m)
{
    int j;
    do
    {
        j = n - 1;
        while (j != -1 && a[j] >= a[j + 1])
            j--;
        if (j == -1)
            return false; // больше размещений нет
        int k = n - 1;
        while (a[j] >= a[k])
            k--;
        swap(a, j, k);
        int l = j + 1, r = n -
                           1; // сортируем оставшуюся часть последовательности
        while (l < r)
            swap(a, l++, r--);
    }
    while (j > m - 1);
    return true;
}
void Print(int* a, int n)
{
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
}
int main()
{
    int n, m, *a;
    cout << "N = ";
    cin >> n;
    cout << "M = ";
    cin >> m;
    if (m <= 0 || n <= 0 || n < m)
    {
        cout << "Error" << endl;
    }
    else
    {
        a = new int[n];
        for (int i = 0; i < n; i++)
            a[i] = i + 1;
        Print(a, m);
        while (NextSet(a, n, m))
            Print(a, m);
    }
    return 0;
}
READ ALSO
Как добавить pkgconfig в CMakeLists.txt

Как добавить pkgconfig в CMakeLists.txt

Хочу заменить часть скриптов на Python более быстрыми аналогами на C++В первую очередь интересует SAX парсеры из libxml++-3

254
Заполнить двухмерный массив зигзагом JS [требует правки]

Заполнить двухмерный массив зигзагом JS [требует правки]

Здесь пример этого массива на картинке

338
Цикл, доходя до кнопки останавливается, а по нажатию на нее продолжает работу

Цикл, доходя до кнопки останавливается, а по нажатию на нее продолжает работу

Что-то типа теста по математике для малышейЕсть форма на странице

264