Cod sursa(job #1322183)

Utilizator ThomasFMI Suditu Thomas Thomas Data 19 ianuarie 2015 20:41:17
Problema Patrate 3 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;

#define NMax 1005
#define epsilon 0.0001f

ifstream f("patrate3.in");
ofstream g("patrate3.out");

int n,sol;
int dnr;

struct point
{
    double x,y;

    bool operator < (const point &t) const
    {
        if(t.x == x) return t.y < y;
        else return t.x < x;
    }

} P[NMax];
struct line
{
    point a,b;
    double l;

    bool operator < (const line &t) const
    {
        if(t.l == l) return t.a < a;
        else return t.l > l;
    }

} D[NMax*NMax];

int main()
{
    int i,j;

    f>>n;
    for(i=1;i<=n;++i)
    {
        f>>P[i].x>>P[i].y;
    }

    for(i=1;i<n;++i) for(j=i+1;j<=n;++j)
    {
        ++dnr;
        if((P[i].x == P[j].x && P[i].y < P[j].y) || (P[i].x < P[j].x))
        {
            D[dnr].a = P[i];
            D[dnr].b = P[j];
        }
        else
        {
            D[dnr].b = P[i];
            D[dnr].a = P[j];
        }
        D[dnr].l = sqrt( (D[dnr].b.x - D[dnr].a.x)*(D[dnr].b.x - D[dnr].a.x) + (D[dnr].b.y - D[dnr].a.y)*(D[dnr].b.y - D[dnr].a.y) );
    }

    sort(D+1,D+dnr+1);

    int p = 0;

    for(i=1;i<=dnr;++i)
    {
        if(D[i].l - D[i-1].l < epsilon)
        {
            ++p;
        }
        else
        {
            sol += p/4;
            p=1;
        }
    }

    g<<sol<<"\n";

    f.close();
    g.close();
    return 0;
}