Cod sursa(job #1137673)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 9 martie 2014 13:40:14
Problema Triang Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.18 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;

#define cnr ComplexNr
#define PRECISION 0.00000001
#define scale 0.0001

const double PI=atan(1)*4;

class ComplexNr{
    public:double real,img,mod,angle;
    public:ComplexNr() {real=img=mod=angle=0;}
    bool riupdate()
    {
        real=mod*cos(angle);
        img=mod*sin(angle);
        return true;
    }
    bool maupdate()
    {
        if ((img==0)&&(real==0))
            angle=0;
        else
            angle=atan2(img,real);
        mod=sqrt(real*real+img*img);
        return true;
    }
    public:ComplexNr(double a,double b,bool arg)
    {
        if (arg==false)
        {
            real=a;
            img=b;
            maupdate();
        }
        if (arg==true)
        {
            mod=a;
            angle=b;
            riupdate();
        }
    }
};

cnr operator + (cnr z1,cnr z2)
{
    cnr z;
    z.real=z1.real+z2.real;
    z.img=z1.img+z2.img;
    z.maupdate();
    return z;
}

cnr operator - (cnr z1,cnr z2)
{
    cnr z;
    z.real=z1.real-z2.real;
    z.img=z1.img-z2.img;
    z.maupdate();
    return z;
}

cnr operator * (cnr z1,cnr z2)
{
    cnr z;
    z.mod=z1.mod*z2.mod;
    z.angle=z1.angle+z2.angle;
    z.riupdate();
    return z;
}

cnr operator / (cnr z1,cnr z2)
{
    cnr z;
    z.mod=z1.mod/z2.mod;
    z.angle=z1.angle-z2.angle;
    z.riupdate();
    return z;
}

ostream& operator << (ostream& out,cnr z)
{
    out<<z.real<<' '<<z.img<<' '<<z.mod<<' '<<z.angle;
    return out;
}

double mod(double nr)
{
    if (nr<0)
        return -nr;
    return nr;
}

cnr rot(cnr source,cnr middle,double angle)
{
    cnr ax(1,angle,true);
    cnr ax2;
    ax2=(source-middle)*ax+middle;
    return ax2;
}

vector <pair <double,double> > points;
int n,i,i1,k;
double x,y;
cnr z1,z2,z31,z32;

int main(void)
{
    FILE * f;
    f=fopen("triang.in","r");
    ofstream g("triang.out");
    fscanf(f,"%d",&n);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%lf%lf",&x,&y);
        x=(int(x/scale))*scale;
        y=(int(y/scale))*scale;
        //cout<<x<<' '<<y<<'\n';
        points.push_back(make_pair(x,y));
    }
    sort(points.begin(),points.end());

    for (i=0;i<n;i++)
        for (i1=i+1;i1<n;i1++)
        {
            z1=cnr(points[i].first,points[i].second,false);
            z2=cnr(points[i1].first,points[i1].second,false);
            z31=rot(z1,z2,PI/3);
            z32=rot(z1,z2,-PI/3);
            //cout<<"\n\n"<<z1.real<<' '<<z1.img<<"   "<<z2.real<<' '<<z2.img<<": "<<z31.real<<' '<<z31.img<<"   "<<z32.real<<' '<<z32.img;
            x=z31.real;
            y=z31.img;
            x=(int(x/scale))*scale;
            y=(int(y/scale))*scale;
            if ((binary_search(points.begin(),points.end(),make_pair(x,y)))==true)
                k++;

            x=z32.real;
            y=z32.img;
            x=(int(x/scale))*scale;
            y=(int(y/scale))*scale;
            if ((binary_search(points.begin(),points.end(),make_pair(x,y)))==true)
                k++;
        }
    g<<k/2;
    g.close();
    return 0;
}