Cod sursa(job #31122)

Utilizator varuvasiTofan Vasile varuvasi Data 15 martie 2007 15:51:59
Problema Triang Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 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++)
	{
	    if (P[j].x - P[i].x < EPS) ma = INF;
	    else 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 (fabs(P[k].x - xsol) < EPS && fabs(P[k].y - ysol) < EPS)
		 {
		     //fprintf(fout, "%lf %lf %lf %lf %lf %lf\n", A.x, A.y, B.x, B.y, xsol, ysol);
		     sol++;
		 }
		 continue;
	    }
	    else md = -(1.0 / ma);
	    mx = (ma + sqrt(3))/(1 - ma*sqrt(3));
	    
	    if (fabs(md - 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 (fabs(P[k].x - xsol) < EPS && fabs(P[k].y - ysol) < EPS)
		 {
		    //fprintf(fout, "%lf %lf %lf %lf %lf %lf\n", A.x, A.y, B.x, B.y, xsol, ysol);
		     sol++;
		 }

	    //fprintf(fout, "%lf %lf\n", xsol, ysol);
	    mx = (ma - sqrt(3))/(1 + ma*sqrt(3));

	    if (fabs(md - 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 (fabs(P[k].x - xsol) < EPS && fabs(P[k].y - ysol) < EPS)
		{
		   //fprintf(fout, "%lf %lf %lf %lf %lf %lf\n", A.x, A.y, B.x, B.y, xsol, ysol);
		     sol++;
		}
	    //fprintf(fout, "%lf %lf\n", xsol, ysol);
	}

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