Cod sursa(job #120115)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 4 ianuarie 2008 11:58:03
Problema Bibel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
long long int cod,i,sol,
xv[20],yv[20],dv[20],nv,
xn[20],yn[20],dn[20],nn,
xc[20],yc[20],dc[20],
viz[20],bila[20];
void solve(long long int poz);
int main()
{
	FILE *f,*g;f=fopen("bibel.in","r");g=fopen("bibel.out","w");
	nv=1;xv[1]=0;yv[1]=0;
	do
	{
	    fscanf(f,"%lld",&cod);
	    if(cod==0){nn++;fscanf(f,"%lld%lld",&xn[nn],&yn[nn]);dn[nn]=1000;}
	    else
	    if(cod==1)
	    {  for(i=1;i<=nv;i++)
	       {xc[0]=xv[i];yc[0]=yv[i];dc[0]=dv[i];solve(1);}
	       sol=dn[1];for(i=1;i<=nn;i++)if(sol>dn[i])sol=dn[i];
	       for(i=0;i<20;i++)
	       {xv[i]=xn[i];xn[i]=0;
	       yv[i]=yn[i];yn[i]=0;
	       dv[i]=dn[i];dn[i]=0;}
	       nv=nn;nn=0;
	       fprintf(g,"%lld\n",sol);
	    }
	}while(cod!=2);
	fcloseall();
	return 0;
}
void solve(long long int poz)
{       long long int il;
	if(poz==nn+1)
	{ if(dn[bila[poz-1]]>dc[poz-1])
	   dn[bila[poz-1]]=dc[poz-1];
	   return;
	}
	for(il=1;il<=nn;il++)
	{ if(!viz[il])
	  { viz[il]=1;
	    bila[poz]=il;
	    xc[poz]=xn[il];
	    yc[poz]=yn[il];
	    dc[poz]=
	    dc[poz-1]+
	    (xc[poz]-xc[poz-1])*(xc[poz]-xc[poz-1])+
	    (yc[poz]-yc[poz-1])*(yc[poz]-yc[poz-1]);
	    solve(poz+1);
	    dc[poz]=0;
	    yc[poz]=0;
	    xc[poz]=0;
	    bila[poz]=0;
	    viz[il]=0;
	  }
	}
}