Cod sursa(job #2189885)

Utilizator frodobiosif aug frodob Data 29 martie 2018 12:10:49
Problema Generare de permutari Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>

using namespace std;
// globals
fstream outFile("permutari.out", ios::out);

void back(int n);
void init_perm(int* p, int n);
void print_perm(int* p, int n);
bool is_valid(int* p, int position);

int main() {
    fstream inFile("permutari.in", ios::in);
    int N = 0;
    // read the number of elements
    inFile >> N;
    // compute using backtraking
    back(N);
    // end
    inFile.close();
    outFile.close();
}

void back(int n) {
    int * permutare = new int[n];
    init_perm(permutare, n);
    int v = 0;
    while (v >= 0) {
        permutare[v]++;
        if ( (permutare[v] <= n) && (is_valid(permutare, v)) ) {
            if (n - 1 == v)
                print_perm(permutare, n);
            else
                v++;
        }
        else if (permutare[v] > n){ // move v back a position
            permutare[v] = 0;
            v--;
        }
    }
    delete[] permutare;
}

void init_perm(int* p, int n) {
    for (int i = 0; i < n; *(p + i) = 0, i++);
}

void print_perm(int* p, int n) {
    for (int i = 0; i < n - 1; i++)
        outFile << p[i] << "  ";
    outFile << p[n - 1] << endl;
}

bool is_valid(int* p, int position) {
    for (int i = 0; i < position; i++) {
        if (p[i] == p[position])
            return false;
    }
    return true;
}