Cod sursa(job #769061)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 18 iulie 2012 10:44:03
Problema Triang Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<math.h>
#include<stdlib.h>
using namespace std;
#define mod 101
#define eps 0.00000001
struct mpunct {
	double x,y;
	inline mpunct(double _x, double _y) {
		x=_x;
		y=_y;
	}
};
struct punct {
	double x,y;
};
vector <mpunct> v[mod];
punct a[1501];
inline int egal(double x, double y)
{
	double d;
	d=(double)fabs(x-y);
	if((double)d<=eps)
		return 1;
	return 0;
}
inline void adauga(punct x)
{
	v[abs((int)(x.x+x.y))%mod].push_back(mpunct(x.x,x.y));
}
inline int cauta(punct x)
{
	int k;
	k=abs((int)(x.x+x.y))%mod;
	for(vector <mpunct> :: iterator it=v[k].begin();it!=v[k].end();it++)
		if(egal(x.x,it->x) && egal(x.y,it->y))
			return 1; 
	return 0;
}
double distanta(punct x, punct y)
{
	double d;
	d=(double)(x.x-y.x)*(x.x-y.x)+(double)(x.y-y.y)*(x.y-y.y);
	return d;
}
inline int verifica(punct x, punct y, punct c)
{
	double aa,bb,cc;
	aa=distanta(x,y);
	bb=distanta(x,c);
	cc=distanta(y,c);
	if(egal(aa,bb) && egal(bb,cc))
		return 1;
	return 0;
}
int main ()
{
	int n,i,j,nr;
	punct aa,b,m,nn;
	double dx,dy,rt;
	ifstream f("triang.in");
	ofstream g("triang.out");
	f>>n;
	for(i=1;i<=n;i++) {
		f>>a[i].x>>a[i].y;
		adauga(a[i]);
	}
	f.close();
	rt=(double)sqrt(3)/6;
	nr=0;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(i!=j) {
				b.x=(double)(2*a[j].x-a[i].x);
				b.y=(double)(2*a[j].y-a[i].y);
				aa.x=(double)(2*a[i].x-a[j].x);
				aa.y=(double)(2*a[i].y-a[j].y);
				dx=(double)rt*(double)(aa.y-b.y);
				dy=(double)rt*(double)(b.x-aa.x);
				nn.x=(double)(aa.x+b.x)/2;
				nn.y=(double)(aa.y+b.y)/2;
				m.x=nn.x+dx;
				m.y=nn.y-dy;
				if(verifica(m,a[i],a[j]))
					nr=nr+cauta(m);
				m.x=nn.x-dx;
				m.y=nn.y+dy;
				if(verifica(m,a[i],a[j]))
					nr=nr+cauta(m);
				if((dx==0)||(dy==0))
					break;
				m.x=nn.x+dx;
				m.y=nn.y+dy;
				if(verifica(m,a[i],a[j]))
					nr=nr+cauta(m);
				m.x=nn.x-dx;
				m.y=nn.y-dy;
				if(verifica(m,a[i],a[j]))
					nr=nr+cauta(m);
			}
	g<<nr/3;
	g.close();
	return 0;
}