Pagini recente » Cod sursa (job #477410) | Cod sursa (job #2212236) | Cod sursa (job #2767996) | Cod sursa (job #2517639) | Cod sursa (job #542407)
Cod sursa(job #542407)
#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;
}