Cod sursa(job #214314)

Utilizator za_wolfpalianos cristian za_wolf Data 13 octombrie 2008 21:06:40
Problema Tije Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<stdio.h>
#include<string.h>
short  z[101],elem,qqq,x[101][101],i,kkt,fin,w,j,n,m,k,l,a,s,poz,q;
char y[101];
void golesc(short poz)
{
	short i,j;
   while (x[poz][0]>1)
   {
	for (i=n+1;i>poz;i--)
	  while (x[i][0]<n&&x[poz][0]>1)
	  {
		 x[i][0]++;
		 x[i][x[i][0]]=x[poz][x[poz][0]];
		 x[poz][x[poz][0]]=0;
		 x[poz][0]--;
		 printf("%u %u\n",poz,i);
	  }
   }
}

short caut(short nr,short q)
{
   short i,j,k,p;
   k=1000;
   for (i=q+1;i<=n+1;i++)
   {
	for (j=x[i][0];j>=1;j--)
		if (x[i][j]==nr)
		 {
			if (j<k) {k=j;p=i;}
			j=1;
		 }
   }
   return p;
}

short clear(short poz,short nr)
{
   short i,j,k;
   k=1;
	while (x[poz][x[poz][0]]!=nr)
   {
	  for (i=n+1;i>q;i--)
		if (x[i][0]<n&&poz&&x[poz][x[poz][0]]!=nr&&i!=poz&&x[poz][0])
		{
			x[i][++x[i][0]]=x[poz][x[poz][0]];
			x[poz][x[poz][0]]=0;
			x[poz][0]--;
			printf("%u %u\n",poz,i);

			i=n+2;
		}
   }
   return 1;
}

int main()
{
	freopen("tije.in","r",stdin);
	freopen("tije.out","w",stdout);
   scanf("%u",&n);

   for (i=1;i<=n;i++)
	for (j=1;j<=n;j++)
		x[i][++x[i][0]]=i;

   for (i=1;i<=n;i++)
   {
	  golesc(i);
	  memset(y,0,sizeof(y));
	  y[x[i][1]]=1;

	  while (x[i][0]<n)
	  {
		  fin=101;
		  elem=-1;

		  for (j=1;j<=n;j++)
		  if (y[j]==0)
		  {
			for (l=i+1;l<=n+1;l++)
			 {
				for (w=x[l][0];w>=1&&x[l][w]!=j;w--);
				s=x[l][0]-w;
				if (s<fin) if (n-(n-x[l][0])-(n-x[i][0])>=s) {fin=s; poz=l; elem=j;}

			 }
		  }
				kkt=clear(poz,elem); // clear tija poz pana la elementu j
				x[poz][x[poz][0]--]=0;
				x[i][++x[i][0]]=elem;
				printf("%u %u\n",poz,i);
				y[elem]=1;

	  }
   }


   return 0;
}