Cod sursa(job #961289)

Utilizator primulDarie Sergiu primul Data 11 iunie 2013 20:57:18
Problema Sortare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>
 
#define NMAX 5005
 
int n,v[NMAX],sol;
int a[NMAX],b[NMAX],c[NMAX];
 
inline void baga(int poz, int val)
{
  //  printf("A %d-a pozitie sa fie %d\n",poz,val);
    int i;
    for(i = 1; i <= n; i++)
    {
        if(!v[i])
            poz--;
        if(!poz)
        {
            v[i] = val;
            break;
        }
    }
}
 
inline void recursiv(int lung, int st, int dr)
{
  //  printf("%d %d %d\n",lung,st,dr);
    sol++;
    if(!lung)
        return ;
    if(lung == 1)
    {
        baga(1,dr);
        return ;
    }
    if(a[lung] != b[lung] && a[lung] != c[lung] && b[lung] != c[lung])
    {
        baga(a[lung],st);
        if(b[lung] > a[lung])
            baga(b[lung] - 1,st + 1);
        else
            baga(b[lung], st + 1);
        recursiv(lung - 2, st + 2, dr);
        return ;
    }
    if(a[lung] == b[lung] || a[lung] == c[lung])
    {
        baga(a[lung],st);
        recursiv(lung - 1, st + 1,dr);
        return ;
    }
    baga(c[lung],st);
    recursiv(lung - 1, st + 1,dr);
}
 
int main ()
{
    int i;
 
    freopen("sortare.in","r",stdin);
    freopen("sortare.out","w",stdout);
 
    scanf("%d",&n);
    for(i = 2; i <= n; i++)
        scanf("%d%d%d",&a[i],&b[i],&c[i]);
    sol = 0;
    recursiv(n,1,n);
    printf("%d\n",sol);
    for(i = 1; i <= n; i++)
        printf("%d ",v[i]);
    printf("\n");
 
    return 0;
}