Cod sursa(job #1001308)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 24 septembrie 2013 20:24:25
Problema Sortare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
#include <set>
#define MAXN 5005
using namespace std;
ifstream f("sortare.in");
ofstream g("sortare.out");

int n,a[MAXN],b[MAXN],c[MAXN],perm[MAXN],lvl,x;
set<int> v;
set<int>::iterator it,it2;

void solve(int p);

int main()
{
    int i;
    f>>n;
    for(i=1;i<=n;i++)
        v.insert(i);
    for(i=2;i<=n;i++)
        f>>a[i]>>b[i]>>c[i];
    solve(n);
    g<<lvl<<'\n';
    for(i=1;i<=n;i++)
        g<<perm[i]<<' ';
    f.close();
    g.close();
    return 0;
}

void solve(int p){
    int i;
    if(p<=2){
        for(i=1;i<=p;i++){
            perm[*v.begin()]=i;
            v.erase(v.begin());}
        if(p==2)
            lvl+=2;
        else
            lvl++;
        return;}
    lvl++;
    if(a[p]==b[p]||a[p]==c[p]||b[p]==c[p]){
        x=a[p];
        if(b[p]!=x&&c[p]!=x)
            x=b[p];
        for(it=v.begin(),i=1;i<x;it++,i++);
        perm[*it]=p;
        v.erase(it);
        return solve(p-1);}
    for(it=v.begin(),i=1;i<a[p];it++,i++);
    perm[*it]=p;
    for(it2=v.begin(),i=1;i<b[p];it2++,i++);
    perm[*it2]=p-1;
    v.erase(it);
    v.erase(it2);
    return solve(p-2);}