Cod sursa(job #14431)

Utilizator alinaddoca alina alinad Data 8 februarie 2007 23:06:23
Problema Trapez Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include<stdio.h>


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


int n;
long x[1001], y[1001];


struct nod
{
 long x1, y1, x2, y2;
 nod *urm;
};

nod *prim, *ultim;


void creare_lista()
{
 nod *p;

 int i, j;
 for(i=1; i<n; i++)
  for(j=i+1; j<=n; j++)
   {
    p=new nod;
    p->x1=x[i];
    p->y1=y[i];
    p->x2=x[j];
    p->y2=y[j];
    p->urm=NULL;
    if(prim==NULL)
      prim=ultim=p;
    else
     {
      ultim->urm=p;
      ultim=p;
     }

    if(p->y1<p->y2)
     {
      p->y2=p->y2-p->y1;
      p->y1=0;
      p->x2=p->x2-p->x1;
      p->x1=0;
     }
    else
     {
      p->y1=p->y1-p->y2;
      p->y2=0;
      p->x1=p->x1-p->x2;
      p->x2=0;
     }
   }
}


/*void translatare()
{
 nod *p;
 p=prim;
 while(p)
  {
   if(p->y1<p->y2)
    {
     p->y2=p->y2-p->y1;
     p->y1=0;
     p->x2=p->x2-p->x1;
     p->x1=0;
    }
   else
    {
       p->y1=p->y1-p->y2;
       p->y2=0;
       p->x1=p->x1-p->x2;
       p->x2=0;
    }
   p=p->urm;
  }
} */


void verificare()
{
 long NR, nry, nrx;
 nod *p, *q;
 p=prim;
 NR=0;
 nrx=nry=0;

 /*while(p)
  {
   if(p->y1==0 && p->x1!=0 || p->y2==0 && p->x2!=0)
      nry++;
   if(p->x1==0 && p->y1!=0 || p->x2==0 && p->y2!=0)
      nrx++;
   p=p->urm;
  }
 if(nry>=2)
   NR=nry*(nry-1)/2;
 if(nrx>=2)
   NR=NR+nrx*(nrx-1)/2;    */

 p=prim;
 while(p)
  {
   if(p->y1==0 && p->x1!=0 || p->y2==0 && p->x2!=0)
      nry++;
   if(p->x1==0 && p->y1!=0 || p->x2==0 && p->y2!=0)
      nrx++;
   q=p->urm;
   if(p->x1!=0 && p->y1!=0)
     while(q)
      {
       if(q->x1!=0 && q->y1!=0)
	 {
	  if((float)p->x1/q->x1==(float)p->y1/q->y1)
		NR++;
	 }
       else
	if(q->x2!=0 && q->y2!=0)
	 {
	  if((float)p->x1/q->x2==(float)p->y1/q->y2)
		NR++;
	 }
       q=q->urm;
      }
   else
    if(p->x2!=0 && p->y2!=0)
      while(q)
       {
	if(q->x1!=0 && q->y1!=0)
	 {
	  if((float)p->x2/q->x1==(float)p->y2/q->y1)
		NR++;
	 }
	else
	 if(q->x2!=0 && q->y2!=0)
	  {
	   if((float)p->x2/q->x2==(float)p->y2/q->y2)
		NR++;
	  }
	q=q->urm;
       }
   p=p->urm;
  }

 if(nry>=2)
   NR=NR+nry*(nry-1)/2;
 if(nrx>=2)
   NR=NR+nrx*(nrx-1)/2;


 fprintf(g, "%ld", NR);
}



int main()
{
 int i;
 fscanf(f, "%d", &n);
 for(i=1; i<=n; i++)
   fscanf(f, "%ld%ld", &x[i], &y[i]);
 fclose(f);
 creare_lista();
 //translatare();
 verificare();
 fclose(g);

 return 0;

}