Cod sursa(job #70659)

Utilizator a7893Nae Mihai a7893 Data 6 iulie 2007 18:01:29
Problema Patrate 3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<stdio.h>
#include<math.h>
int n,nr;
struct vec{
	float x,y;
}a[1000],aux;
void read()
{
	int i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%f %f",&a[i].x,&a[i].y);
}
void sort()
{
	int i,ok;
	do
	{
		ok=0;
		for(i=0;i<n-1;i++)
			if(a[i].x>a[i+1].x)
			{
				aux=a[i];
				a[i]=a[i+1];
				a[i+1]=aux;
				ok=1;
			}
	}while(ok);
}
float abs(float x)
{
	if(x<0)
		return -x;
	return x;
}
void solve()
{
	int i,j,li,ls,ok,k;
	float x0,y0,x1,y1,x2,y2,x3,y3,mijx,mijy,dx,dy;
	sort();
	for(i=0;i<n-1;i++)
	{
		x0=a[i].x;
		y0=a[i].y;
		for(j=i+1;j<n;j++)
		{
			x1=a[j].x;
			y1=a[j].y;
			mijx=(x0+x1)/2;
			mijy=(y0+y1)/2;
			dx=abs(mijx-x0);
			dy=abs(mijy-y0);
			if(y0<y1)
			{
				x2=mijx+dy;
				y2=mijy-dx;
				x3=mijx-dy;
				y3=mijy+dx;
			}
			else
			{
				x2=mijx-dy;
				y2=mijy-dx;
				x3=mijx+dy;
				y3=mijy+dx;
			}
			li=0;
			ls=n-1;
			ok=1;
			while(li<=ls&&ok)
			{
				k=(li+ls)/2;
				if(floor(a[k].x)==floor(x2)&&a[k].y==y2)
					ok=0;
				else
					if(a[k].x<x2)
						li=k+1;
					else
						ls=k-1;
			}
			if(ok==0)
				nr++;
			li=0;
			ls=n-1;
			ok=1;
			while(li<=ls&&ok)
			{
				k=(li+ls)/2;
				if(floor(a[k].x)==floor(x3)&&a[k].y==y3)
					ok=0;
				else
					if(a[k].x<x3)
						li=k+1;
					else
						ls=k-1;
			}
			if(ok==0)
				nr++;
		}
	}
	printf("%d\n",nr);
}
int main()
{
	freopen("patrate3.in","r",stdin);
	freopen("patrate3.out","w",stdout);
	read();
	solve();
	return 0;
}