Pagini recente » Cod sursa (job #1259101) | Cod sursa (job #3225639) | Cod sursa (job #2182295) | Cod sursa (job #2568268) | Cod sursa (job #2758351)
#include <fstream>
#include<cmath>
#include<algorithm>
#define eroare 0.0001
using namespace std;
ifstream f("patrate3.in");
ofstream g("patrate3.out");
int n, k;
struct coordonate
{
double x,y;
}a, b ,v[1010];
bool compara(coordonate a, coordonate b)
{
if(abs(a.x-b.x) < eroare)
return a.y<b.y;
return a.x<b.x;
}
bool cauta(coordonate a)
{
int mij, st, dr;
st=1, dr=n;
while(st<=dr)
{
mij=(st+dr)/2;
if(abs(v[mij].x-a.x)<eroare && abs(v[mij].y-a.y)<eroare)
return true; /// am gasit punctul
if(compara(v[mij],a))
st=mij+1;
else
dr=mij-1;
}
return false;
}
int main()
{
f>>n;
for(int i=1;i<=n;i++)
{
f>>v[i].x>>v[i].y;
}
///sortam crescator vectorul de puncte(dupa abscise, iar pt abscise egale dupa ordonate)
sort(v+1,v+n+1,compara);
for(int i=1 ; i<n ; i++)
for(int j=i+1 ; j<=n ; j++)///punctele v[i] si v[j] formeaza o diagonala
{ a.x=v[i].x+v[i].y-v[j].y;
a.y=v[i].y+v[j].x-v[i].x;
b.x=v[j].x+v[i].y-v[j].y;
b.y=v[j].y+v[j].x-v[i].x;
///cautam binar cele 2 puncte aflate, iar daca sunt gasite inseamna ca formeaza un patrat cu cele 2 puncte alese initial
if(cauta(a) && cauta(b))
k++;
}
g<<k/2;
}