Cod sursa(job #542418)

Utilizator robigiirimias robert robigi Data 26 februarie 2011 13:09:53
Problema Sortari2 Scor 20
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 2 Marime 0.8 kb
#include <cstdio>

using namespace std;

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


int n, nr;
int v[1001];
int viz[1001];
int w[1001];

void swap(int &a, int &b)
{
	int h=a; a=b; b=h;
}

void afis()
{
	int s=0;
	int ks=0;
	for (int i=1; i<=n; ++i)
	{
		for (int j=i+1; j<=n; ++j)
			if (v[i]>v[j]) ++s;
		w[i]=v[i];
	}
	
		
	for (int k=1; k<=n; ++k)
		while (w[k]!=k)
		{
			swap(w[k], w[w[k]]);
			++ks;
		}
	if (ks<s) ++nr;
}

void prog(int i)
{
	if (i==n+1) 
	{
		afis();
		
		return ;
	}
	for (int j=1; j<=n; ++j)
	{
		if (!viz[j])
		{
			viz[j]=1;
			v[i]=j;
			prog(i+1);
			viz[j]=0;
		}
	}
}

int main()
{
	fscanf(f, "%d", &n);
	
	prog(1);

	fprintf(g, "%d", nr);
	
	fclose(f);
	fclose(g);
	
	return 0;
}