Cod sursa(job #2776916)

Utilizator andcovAndrei Covaci andcov Data 21 septembrie 2021 16:49:46
Problema Generare de permutari Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
//
// Created by Andrei Covaci on 03.09.2021.
// https://infoarena.ro/problema/ciur
//

#include <fstream>
#include <iostream>
#include <vector>

#define INPUT "permutari.in"
#define OUTPUT "permutari.out"
//#define INPUT "input.in"
//#define OUTPUT "output.out"

using namespace std;


int read() {
    ifstream in(INPUT);

    int n;
    in >> n;

    in.close();
    return n;
}

int smallest_right(vector<int>& vec) {
    for(int i = vec.size() - 2; i >= 0; --i)
        if (vec[i] < vec[i + 1])
            return i;

    return -1;
}

int ceil_right(vector<int>& vec, int pos) {
    for(int i = vec.size(); i > pos; --i) {
        if (vec[pos] < vec[i]) {
            return i;
        }
    }
    return pos;
}

void reverse(vector<int>& vec, int first) {
    for(int i = 1; i <= (vec.size() - first) / 2; ++i) {
        swap(vec[first + i], vec[vec.size() - i]);
    }
}

int solve(int n) {
    ofstream out(OUTPUT);

    vector<int> base;
    for(int i = 1; i <= n; ++i) {
        base.emplace_back(i);
    }

    while(true) {
        for(auto e : base) {
            out << e << ' ';
        }
        out << '\n';

        int first = smallest_right(base);
        if (first == -1) {
            break;
        }

        int second = ceil_right(base, first);

        swap(base[first], base[second]);

        reverse(base, first);

    }

    out.close();
    return 0;

}

void print(int n) {
}

int main() {
    auto nums = read();
    auto res = solve(nums);
    print(res);

    return 0;
}