Pagini recente » Cod sursa (job #2500084) | Cod sursa (job #1270823) | Cod sursa (job #686812) | Cod sursa (job #2479812) | Cod sursa (job #769060)
Cod sursa(job #769060)
#include<iostream>
#include<fstream>
#include<vector>
#include<math.h>
#include<stdlib.h>
using namespace std;
#define mod 101
#define eps 0.01
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;
}