Cod sursa(job #116954)

Utilizator QbyxEros Lorand Qbyx Data 19 decembrie 2007 21:55:22
Problema Trapez Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <stdlib.h>

struct tort{long long szamlalo; long long nevezo;};
struct pont{long int x; long int y;};

tort egyenesek[1000010];
pont pontok[1010];

int hasonlit(const void *egyenes1,const void *egyenes2)
{
    tort a, b;

    a = *(tort*)egyenes1;
    b = *(tort*)egyenes2;

    return(a.szamlalo * b.nevezo - b.szamlalo * a.nevezo);
}

int main()
{
   FILE *f;
   int i, j, n, k = 0, db, r = 0; 

   f = fopen("trapez.in", "rt");
   fscanf(f, "%d", &n);
   for (i = 0; i < n; i++)
      fscanf(f, "%li %li", &pontok[i].x, &pontok[i].y);
   fclose(f);

   for (i = 0; i < n - 1; i++)
       for (j = i + 1; j < n; j++)
       {
	   egyenesek[k].szamlalo = pontok[j].x - pontok[i].x;
	   egyenesek[k].nevezo = pontok[j].y - pontok[i].y;

	   if (egyenesek[k].nevezo < 0)
	   {
	       egyenesek[k].szamlalo *= -1;
	       egyenesek[k].nevezo *= -1;
	   }
	   k++;
       }
   qsort(egyenesek, n*(n-1)/2, sizeof(tort), hasonlit);
   
   for (i = 0; i < k; i++)
   {
       db = 1;
       while (egyenesek[i].szamlalo * egyenesek[i + 1].nevezo == 
	       egyenesek[i + 1].szamlalo * egyenesek[i].nevezo && db + i < k)
       {
	   db++;
	   i++;
       }
       r += db * (db - 1) / 2;
   }

   f = fopen("trapez.out", "wt");
   fprintf(f, "%d", r);
   fclose(f);
}