Cod sursa(job #1010649)

Utilizator impulseBagu Alexandru impulse Data 15 octombrie 2013 13:13:57
Problema Generare de permutari Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>

int isPerm(int* v, int *b, int n)
{
    for(int i = 0; i < n; i++)
        b[i] = 0;
    for(int i = 0; i < n; i++)
    {
        b[v[i]]++;
        if(b[v[i]] > 1)
            return 0;
    }
    return 1;
}

int inc(int* v, int n, int i)
{
    if(i == n) return 0;
    v[n-i-1]++;
    if(v[n-i-1] == n)
    {
        v[n-i-1] = 0;
        inc(v, n, i+1);
    }
}

int fact (int n)
{
    int b = 1;
    for(int i = 2; i <= n; i++)
        b*=i;
    return b;
}

int main()
{
    int n;
    FILE* fr = fopen("permutari.in", "r");
    FILE* fw = fopen("permutari.out", "w");
    fscanf(fr, "%d", &n);

    int *A = new int[n];
    int *B = new int[n];
    for(int i = 0; i < n; i++)
        A[i] = i;
    int facto = fact(n);
    int k = 0;
    bool isPerm;
    while(facto > k)
    {
        isPerm = true;
        for(int i = 0; i < n; i++)
            B[i] = 0;
        for(int i = 0; i < n; i++)
        {
            B[A[i]]++;
            if(B[A[i]] > 1)
            {
                isPerm = false;
                break;
            }
        }
        if(isPerm)
        {
            k++;
            for(int i = 0; i < n; i++)
                fprintf(fw, "%d ", A[i] + 1);
            fprintf(fw, "\n");
        }
        int i = 1;
        while(i <= n)
        {
            A[n-i]++;
            if(A[n-i] == n)
            {
                A[n-i] = 0;
                i++;
            }
            else
                break;
        }
    }
    return 0;
}