Cod sursa(job #37759)

Utilizator AlxCojocaru Alexandru Alx Data 25 martie 2007 12:26:57
Problema Laser Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 4, Clasele 11-12 Marime 1.25 kb
#include <stdio.h>
#include <math.h>
using namespace std;
int n,x[512][4],st[512],nr=0;
double unghi[10001];
int main()
{
 freopen("laser.in","r",stdin);
 freopen("laser.out","w",stdout);
 scanf("%d\n",&n);
 int i,j;
 for (i=0;i<n;i++)
  scanf("%d %d %d %d\n",&x[i][0],&x[i][1],&x[i][2],&x[i][3]);
 for (i=0;i<n;i++)
  scanf("%d ",&st[i]);
 double mx,my,a1,b1,a2,b2,c2;
 for (i=0;i<n;i++)
  if (st[i])
  {
   mx=(double)(x[i][0]+x[i][2])/2;
   my=(double)(x[i][1]+x[i][3])/2;
   st[i]=0;
   a1=-my;
   b1=mx;
   double vx,vy;
   if (mx>0)
    vx=mx+10000;
   else
    vx=mx-10000;
   if (my>0)
    vy=my+10000;
   else
    vy=my-10000;
   for (j=0;j<n;j++)
    if (i!=j)
    {
     a2=x[j][1]-x[j][3];
     b2=x[j][2]-x[j][0];
     c2=x[j][0]*x[j][3]-x[j][2]*x[j][1];
     if ((a1*x[j][0]+b1*x[j][1])*(a1*x[j][2]+b1*x[j][3])<0&&(c2*(a2*vx+b2*vy+c2))<0)
      st[j]=1-st[j];
    }
   if (mx&&my)
    unghi[nr]=atan((double)(my/mx))*180/3.1415926535;
   else
    if (!mx)
     if (my>0)
      unghi[nr]=90;
     else
      unghi[nr]=270;
    else
     if (mx>0)
      unghi[nr]=0;
     else
      unghi[nr]=180;
   nr++;
   i=-1;
  }
 printf("%d\n",nr);
 for (i=0;i<nr;i++)
  printf("%.6f\n",unghi[i]);
 return 0;
}