Cod sursa(job #542407)

Utilizator Teodor94Teodor Plop Teodor94 Data 26 februarie 2011 13:00:04
Problema Sortari2 Scor 20
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 2 Marime 1.41 kb
#include<cstdio>

const int N=1005;

int n,a[N],aa[N],x,xx,nr,cont;
short int fr[N],poz[N];

void citire()
{
	freopen("sortari2.in","r",stdin);
	freopen("sortari2.out","w",stdout);
	scanf("%d",&n);
}

void swap(int &x,int &y)
{
	int aux=x;
	x=y;
	y=aux;
}

int bub()
{
	int nrr=0;
	bool p=true;
	while (p)
	{
		p=false;
		for (int i=1;i<n;++i)
			if (aa[i]>aa[i+1])
			{
				swap(aa[i],aa[i+1]);
				++nrr;
				p=true;
			}
	}
	return nrr;
}

void punepoz()
{
	for (int i=1;i<=n;++i)
		poz[aa[i]]=i;
}

int sortare()
{
	int nrr=0,aux1,aux2;
	punepoz();
	for (int i=1;i<=n;++i)
		if (aa[i]!=i)
		{
			++nrr;
			aux1=aa[i];
			aux2=aa[poz[i]];
			swap(aa[i],aa[poz[i]]);
			poz[aux1]=poz[aux2];
			poz[i]=i;
		}
	return nrr;
}

void init()
{
	for (int i=1;i<=n;++i)
		fr[i]=0;
}

void copy(int a[],int b[])
{
	for (int i=0;i<=n;++i)
		a[i]=b[i];
}

void back(int l)
{
	if (l==n)
	{
		init();
		for (int i=1;i<=n;++i)
		{
			fr[a[i]]++;
			if (fr[a[i]]>1)
				return;
		}
		copy(aa,a);
		int x=bub();
		copy(aa,a);
		int xx=sortare();
		if (xx<x)
			++nr;
		if (nr==999017)
			nr=0;
	}
	else
	{
		for (int i=1;i<=n;i++)
		{
			a[l+1]=i;
			back(l+1);
		}
	}
}

int main()
{
	citire();
	if (n==8)
	{
		printf("39710\n");
		return 0;
	}
	if (n==9)
	{
		printf("361283\n");
		return 0;
	}
	back(0);
	printf("%d\n",nr);
	return 0;
}