Cod sursa(job #913453)

Utilizator Sanduleac_VladSanduleac Vllad Alexandru Sanduleac_Vlad Data 13 martie 2013 15:40:37
Problema Patrate 3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
#define INF 1.79769e+308
#define eps 1.0e-4
#define equal(x,y) (fabs(x - y) < eps)
using namespace std;

struct POINT {            // ma stresezi :(
	double x, y;
};

struct CENTER {
	double x, y, pant, len;
};

double panta(POINT a, POINT b) {
	if(a.x == b.x)
		return INF;
	return fabs(a.y - b.y) / fabs(a.x - b.x);
}

double len(POINT a, POINT b) {
	double l1, l2;
	l1 = fabs(a.x - b.x);
	l2 = fabs(a.y - b.y);
	return sqrt(l1 * l1 + l2 * l2);
}

bool perp(CENTER c1, CENTER c2) {
	return (equal(c1.pant * c2.pant, 1) || (equal(c1.pant, 0) && equal(c2.pant, INF)) || (equal(c2.pant, 0) && equal(c1.pant, INF)));
}

bool iscor(CENTER c1, CENTER c2) {
	return perp(c1, c2);
}

bool cmp(CENTER c1, CENTER c2) {
	if(c1.x < c2.x)
		return true;
	if(c1.x > c2.x)
		return false;
	if(c1.y < c2.y)
		return true;
	if(c1.y > c2.y)
		return false;
	if(c1.len < c2.len)
		return true;
	if(c1.len > c2.len)
		return false;
	if(c1.pant < c2.pant)
		return true;
	if(c1.pant > c2.pant)
		return false;
	return true;
}

vector<POINT> p;
vector<CENTER> c;
long N, nrpat;

int main() {
	long i, j, k;
	double x, y;
	POINT tmp;
	CENTER tmpc;
	freopen("patrate3.in", "r", stdin);
	freopen("patrate3.out", "w", stdout);
	scanf("%ld", &N);
	for(i = 1; i <= N; i++) {
		scanf("%lf %lf", &x, &y);
		tmp.x = x;
		tmp.y = y;
		p.push_back(tmp);
	}
	for(i = 0; i < N - 1; i++)
		for(j = i + 1; j < N; j++) {
			tmpc.x = (p[i].x + p[j].x) / 2;
			tmpc.y = (p[i].y + p[j].y) / 2;
			tmpc.pant = panta(p[i], p[j]);
			tmpc.len = len(p[i], p[j]);
			c.push_back(tmpc);
		}
	sort(c.begin(), c.end(), cmp);
	for(i = 0; i < c.size() - 1; i++)
		if(equal(c[i].x, c[i + 1].x) && equal(c[i].y, c[i + 1].y) && equal(c[i].len, c[i + 1].len)) {
			for(k = i + 1; k < c.size() && c[i].x == c[k].x && equal(c[i].y, c[k].y) && equal(c[i].len, c[k].len); k++);
			k--;
			for(; i < k; i++)
				for(j = k; j > i; j--)
					if(iscor(c[i], c[j]))
						nrpat++;
		}
	printf("%ld", nrpat);
	return 0;
}