Cod sursa(job #31112)

Utilizator varuvasiTofan Vasile varuvasi Data 15 martie 2007 15:35:19
Problema Triang Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <stdio.h>
#include <math.h>
#define MaxN 1001
#define EPS 0.000001
#define INF 100000001

int N, sol;

struct Punct {
    double x, y;
} P[MaxN];
    
int main()
{
    int i, j, k;

    FILE *fin = fopen("triang.in", "rt");
    FILE *fout = fopen("triang.out", "wt");
    fscanf(fin, "%d", &N);
    for (i = 1; i <= N; i++)
        fscanf(fin, "%lf %lf", &P[i].x, &P[i].y);
    
    double l, xsol = 0, ysol = 0, md = 0, mx = 0, ma = 0;

    for (i = 1; i <= N; i++)
	for (j = i + 1; j <= N; j++)
	{
	    ma = (P[j].y - P[i].y)/(P[j].x - P[i].x);
	    l = sqrt((P[j].y - P[i].y)*(P[j].y - P[i].y) + (P[j].x - P[i].x)*(P[j].x - P[i].x));
	    Punct A = P[i], B = P[j];
	    Punct D;
	    D.x = (A.x + B.x) / 2, D.y = (A.y + B.y) / 2;

	    if (ma < EPS)
	    {
		 md = INF;
		 double L = sqrt(3)*0.5*l;
		 xsol = D.x, ysol = D.y + L;
		 for (k = j+1; k <= N; k++)
   	         if (P[k].x - xsol < EPS && P[k].y - ysol < EPS) sol++;
   	         continue;
	    }
	    else md = -(1.0 / ma);
	    mx = (ma + sqrt(3))/(1 - ma*sqrt(3));
	    
	    //if (fabs(ma - mx) < EPS) return 0;
	    xsol = (A.y - D.y + md*D.x - mx*A.x) / (md - mx);
	    ysol = (md*mx*(D.x - A.x) + md*A.y - mx*D.y) / (md - mx);
     
	    for (k = j+1; k <= N; k++)
   	         if (P[k].x - xsol < EPS && P[k].y - ysol < EPS) sol++;
  	
	    //fprintf(fout, "%lf %lf\n", xsol, ysol);
	    mx = (ma - sqrt(3))/(1 + ma*sqrt(3));
	    
	    //if (fabs(ma - mx) < EPS) return 0;
	    xsol = (A.y - D.y + md*D.x - mx*A.x) / (md - mx);
	    ysol = (md*mx*(D.x - A.x) + md*A.y - mx*D.y) / (md - mx);

	    for (k = j+1; k <= N; k++)
		if (P[k].x - xsol < EPS && P[k].y - ysol < EPS) sol++;
	    //fprintf(fout, "%lf %lf\n", xsol, ysol);
        }

    fprintf(fout, "%d", sol);
    fclose(fin);
    fclose(fout);
    return 0;
}