Cod sursa(job #986091)

Utilizator maritimCristian Lambru maritim Data 17 august 2013 17:19:17
Problema Grozavesti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include<stdio.h>
#include<set>
using namespace std;

FILE *f = fopen("grozavesti.in","r");
FILE *g = fopen("grozavesti.out","w");

#define MaxN 400
#define MaxVal 1000

int N,Sol;
int A[MaxN][MaxN];
int SolV[MaxN*2][4];
set<pair<int,int> > viz[MaxVal];

void citire(void)
{
    fscanf(f,"%d ",&N);
    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
            fscanf(f,"%d ",&A[i][j]);
}

void afisare(void)
{
    for(int i=1;i<=N;i++,printf("\n"))
        for(int j=1;j<=N;j++)
            printf("%d ",A[i][j]);
    printf("\n");

    for(int i=1;i<=9;i++)
       printf("%d ",viz[i].size());
    printf("\n");
}


void preprocesare(void)
{
    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
            viz[A[i][j]].insert(make_pair(i,j));
}

inline void swap(int a,int b,int c,int d)
{
    int valA = A[a][b],valB = A[c][d];
    viz[valA].erase(make_pair(a,b));
    viz[valB].erase(make_pair(c,d));
    viz[valB].insert(make_pair(a,b));
    viz[valA].insert(make_pair(c,d));

    int aux = A[a][b];
    A[a][b] = A[c][d];
    A[c][d] = aux;
}

inline void change(int p1,int p2,int diag)
{
    if(p1 != diag)
    {
        for(int i=1;i<=diag;i++)
        {
            swap(p1,i,diag,i);
            //printf("wtf sa dhsad ashjd asjd ash linie = %d %d %d\n",p1,diag,i);
        }
        SolV[++Sol][0] = 0;
        SolV[Sol][1] = p1;
        SolV[Sol][2] = diag;
    }

    if(p2 != diag)
    {
        for(int i=1;i<=diag;i++)
        {
            swap(i,p2,i,diag);
            //printf("wtf sa dhsad ashjd asjd ash coloana = %d %d %d\n",p2,diag,i);
        }
        SolV[++ Sol][0] = 1;
        SolV[Sol][1] = p2;
        SolV[Sol][2] = diag;
    }

    for(int i=1;i<diag;i++)
    {
        viz[A[i][diag]].erase(viz[A[i][diag]].find(make_pair(i,diag)));
        viz[A[diag][i]].erase(viz[A[diag][i]].find(make_pair(diag,i)));
    }

    viz[A[diag][diag]].erase(viz[A[diag][diag]].find(make_pair(diag,diag)));

}

void Rezolvare(void)
{
    int valMax = 1000;
    for(int i=N;i;--i)
    {
        for(;!viz[valMax].size();--valMax);

        change(viz[valMax].begin()->first,viz[valMax].begin()->second,i);
        //printf("dsjhgdadasd\n");
        //afisare();
    }
}

int main()
{
    citire();
    preprocesare();
    Rezolvare();
    fprintf(g,"%d\n",Sol);
    for(int i=1;i<=Sol;i++)
        fprintf(g,"%c %d %d\n",SolV[i][0] ? 'C' : 'L',SolV[i][1],SolV[i][2]);
}