Cod sursa(job #171768)

Utilizator dominoMircea Pasoi domino Data 5 aprilie 2008 00:46:38
Problema Sortare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <string.h>

#define MAX_N 5005
#define FIN "sortare.in"
#define FOUT "sortare.out"

int N, A[MAX_N], B[MAX_N], C[MAX_N], P[MAX_N], Q[MAX_N];

int solve(int n)
{
    int i, j, t, ret;

    if (n == 1) { P[n] = 1; return 1; }
    t = (A[n] != B[n]) && (A[n] != C[n]) && (B[n] != C[n]);
    if (t)
    {
        ret = solve(n-2)+1;
        for (i = j = 1; i <= n; ++i)
            if (i == A[n])
                Q[i] = 1;
            else
            if (i == B[n])
                Q[i] = 2;
            else
                Q[i] = P[j++]+2;
    }
    else
    {
        ret = solve(n-1)+1;
        t = A[n] == B[n] || A[n] == C[n] ? A[n] : B[n];
        for (i = j = 1; i <= n; ++i)
            if (i == t)
                Q[i] = 1;
            else
                Q[i] = P[j++]+1;

    }
    memcpy(P+1, Q+1, n*sizeof(int));
    return ret;
}

int main(void)
{
    int i;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d", &N);
    for (i = 2; i <= N; ++i)
        scanf("%d %d %d", A+i, B+i, C+i);

    printf("%d\n", solve(N));
    for (i = 1; i <= N; ++i)
        printf("%d ", P[i]);
    printf("\n");

    return 0;
}