Cod sursa(job #323890)

Utilizator Andrei200Andrei200 Andrei200 Data 13 iunie 2009 23:56:26
Problema Grozavesti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <cstdio>

#define file_in "grozavesti.in"
#define file_out "grozavesti.out"

#define Nmax 310

struct mutare
{
	char c; 
	int a,b; 
}in[Nmax],fi[Nmax]; 
int nri,nrf;
int m[Nmax][Nmax];
int n;
int solve;

void swap(int *a, int *b)
{
	int aux=*a; 
	*a=*b; 
	*b=aux;
}

void scl(int a, int b)
{
	int i;
	for(i=a;i<=n;++i)
		swap(&m[a][i],&m[b][i]);
}

void scc(int a, int b)
{
	int i;
	for(i=a;i<=n;++i)
		swap(&m[i][a],&m[i][b]);
}

void citire()
{
	int i,j;
	scanf("%d\n",&n);
	for(i=1;i<=n;++i) 
		for(j=1;j<=n;++j) 
			scanf("%d", &m[i][j]);
}

void bk(int k)
{ 
	if(solve) return; 
	if(k>n) 
	{
		int i;
		solve=1; 
		for(i=1;i<=nri;++i)
			fi[i]=in[i]; 
		nrf=nri; 
	}
	else 
	{
		int i;
		if(m[k][k]>=m[k-1][k-1]) 
			bk(k+1); 
		for(i=k+1;i<=n;++i)
		{
			if(m[i][k]>=m[i-1][k-1]) 
			{
				nri++; 
				in[nri].c='L'; 
				in[nri].a=k; 
				in[nri].b=i; 
				scl(k,i); 
				bk(k+1); 
				scl(k,i); 
				nri--; 
			}
			if(m[k][i]>=m[k-1][i-1]) 
			{
				nri++; 
				in[nri].c='C'; 
				in[nri].a=k; 
				in[nri].b=i; 
				scc(k,i); 
				bk(k+1); 
				scc(k,i); 
				nri--; 
			}
		}
	}
}

void afisare()
{
	int i;
	printf("%d\n",nrf); 
	for(i=1;i<=nrf;i++) 
		printf("%c %d %d\n",fi[i].c,fi[i].a,fi[i].b);
}

int main()
{
    freopen(file_in,"r",stdin);
    freopen(file_out,"w",stdout);

    citire();
    bk(1); 
	afisare();
	
	fclose(stdin);
    fclose(stdout);
	
return 0;
}