Cod sursa(job #1902654)

Utilizator mateibanuBanu Matei Costin mateibanu Data 4 martie 2017 18:33:35
Problema Triang Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <math.h>
#include <algorithm>

using namespace std;

FILE*f=fopen("triang.in","r");
FILE*g=fopen("triang.out","w");

int n,nr;

struct pct
{
    double x,y;
}v[1510];

int cmp(pct a,pct b)
{
    if (a.x<b.x||(fabs(a.x-b.x)<0.001&&a.y<b.y)) return 1;
    else return 0;
}

void cauta(double x, double y)
{
    int p=1,u=n,m;
    while (p<u)
    {
        m=(p+u)/2;
        if ((fabs(v[m].x-x)<0.001)&&(fabs(v[m].y-y)<0.001)) {nr++;return;}
        else
        if (v[m].x>x||(fabs(v[m].x-x)<0.001&&v[m].y>y)) u=m;
        else p=m+1;
    }
}

int main()
{
    int i,j;
    double d,e,aux,a,b,c;
    fscanf(f,"%d",&n);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%lf%lf",&v[i].x,&v[i].y);
    }
    sort(v+1,v+n+1,cmp);
    for (i=1;i<n;i++)
        for (j=i+1;j<=n;j++)
        {
            d=(v[i].x-v[j].x)*(v[i].x-v[j].x)+(v[i].y-v[j].y)*(v[i].y-v[j].y);
            e=(v[i].x+v[j].x)/2-(v[i].y+v[j].y)/2;
            c=v[j].x*v[j].x+v[j].y*v[j].y-d;
            b=-2*v[j].x*e-2*v[j].x;
            a=1+e*e;
            d=b*b-4*a*c;
            if (d>0){
            aux=(-b+sqrt(d))/2/a;
            cauta(aux,aux*e);
            aux=(-b-sqrt(d))/2/a;
            cauta(aux,aux*e);
            }
            else if (d<0.001) {aux=-b/2/a;cauta(aux,aux*e);}
        }
    fprintf(g,"%d",nr/3);
    fclose(f);
    fclose(g);
    return 0;
}