Pagini recente » Cod sursa (job #969512) | Cod sursa (job #2059204) | Cod sursa (job #2501915) | Cod sursa (job #1238118) | Cod sursa (job #2619472)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trapez.in");
ofstream fout("trapez.out");
struct puncte
{
double x,y;
}v[1005];
//functie care calculeaza panta a liniei dintre 2 puncte
float panta(float x1, float y1, float x2, float y2)
{
return (y2 - y1) / (x2 - x1);
}
int main()
{
int n,i,j,m;
double pante[100005],pt0=2e9;
fin>>n;
//citim punctele
for(i=0;i<n;i++)
{
fin>>v[i].x>>v[i].y;
}
//vom folosi panta fiecarei linii pentru a verifica daca doua linii sunt paralele
int nr_pante=0;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
nr_pante++;
if(v[j].x-v[i].x==0)
{
// fout<<"nu"<<i<<" "<<j<<" ";
pante[nr_pante]=pt0;
}
else
{
pante[nr_pante]=panta(v[i].x,v[i].y,v[j].x,v[j].y);
}
}
}
/*fout<<'\n';
for(i=1;i<nr_pante;i++)
fout<<pante[i]<<'\n';*/
//sortam vectorul pentru a-l parcurge si vedea cate pante consecutive sunt egale
sort(pante+1,pante+nr_pante+1);
/*fout<<'\n';
for(i=1;i<nr_pante;i++)
fout<<pante[i]<<'\n';*/
int trapez=0;
j=1;
for(i=1;i<nr_pante;i++)
{
//daca doua pante sunt egale atunci crestem numarul de trapeze posibile
if(pante[i]==pante[i-1])
j++;
else
{
//daca avem mai mult de 1 trapez care se poate face cu 2 linii il adaugam
trapez+=(j*(j-1))/2;
//reinitializam nr de trapeze posibile la 0 pentru a continua
j=1;
}
}
trapez+=(j*(j-1))/2;
fout<<trapez;
return 0;
}