Cod sursa(job #186923)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 29 aprilie 2008 08:29:06
Problema Patrate 3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<limits.h>
#define NMAX	1000

struct pct {double  x,y;};
struct segment {
	double d;
	double p;
	pct c;};

void poz(int st,int dr,int &piv,segment x[])
{int i=st,j=dr,d=0;
 segment	t;
 while(i<j) {
			if(x[i].d>x[j].d||x[i].d==x[j].d&&x[i].c.x>x[j].c.x)
					{
					t=x[i];x[i]=x[j];x[j]=t;
					d=1-d;
					}
			  i+=d;
			  j-=1-d;
			}
 piv=i;
}

void qsrt(int left,int right,segment x[])
{int piv;
 if(left<right) {poz(left,right,piv,x);
				 qsrt(left,piv-1,x);
				 qsrt(piv+1,right,x);
				}
}
int main()
{
freopen("patrate3.in","r",stdin);
freopen("patrate3.out","w",stdout);
int n,i,j,k,nrptr;
double dx,dy;
pct	v[NMAX]={{0.0,0.0}};
segment r[NMAX*(NMAX-1)/2]={{0.0,0.0,{0.0,0.0}}};
scanf("%d",&n);
i=0;
double x,y;
while(i<n) {
	scanf("%lf%lf", &x,&y);
	(v+i)->x=x;
	(v+i)->y=y;
	i++;
	}
//construiesc segmente d si c
k=0;
for(i=0;i<n-1;i++)
	for(j=i+1;j<n;j++)
		{
		dx=v[i].x-v[j].x;
		dy=v[i].y-v[j].y;
		r[k].d=sqrt(dx*dx+dy*dy);
		r[k].c.x=(v[i].x+v[j].x)/2;
		r[k].c.y=(v[i].y+v[j].y)/2;
		if(fabs(dy)>0.00001) r[k].p=dx/dy;
		else  r[k].p=LONG_MAX;
		k++;
		}
/*
for(i=0;i<k;i++) printf("(%11.4lf %11.4lf %11.4lf %11.4lf)\n",
				 r[i].d,r[i].p, r[i].c.x,r[i].c.y);
printf("\n"); */
//sortez segmentele
qsrt(0,k-1,r);  /*
for(i=0;i<k;i++) printf("(%11.4lf %11.4lf %11.4lf %11.4lf)\n",
				 r[i].d,r[i].p, r[i].c.x,r[i].c.y);
printf("\n");     */
nrptr=0;
for(i=0;i<k-3;i++){
	if(fabs(r[i].d-r[i+1].d)<0.00001&&
	   fabs(r[i].c.x-r[i+1].c.x)<0.00001&&fabs(r[i].c.y-r[i+1].c.y)<0.00001&&
		fabs((r[i].p*r[i+1].p)+1)<0.00001)
		{nrptr++;   /*
		printf("(%11.4lf %11.4lf %11.4lf %11.4lf)\n",
				 r[i].d,r[i].p*r[i+1].p, r[i].c.x,r[i].c.y); */
		i=i+1;
		}
	}
printf("%d",nrptr);
return 0;
}