Cod sursa(job #40745)

Utilizator razvi9Jurca Razvan razvi9 Data 27 martie 2007 18:21:56
Problema Laser Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<stdio.h>
#include<math.h>
#define max 99
struct {double u1,u2,b;
	} a[513];
char b[100][100],s[513];
int c[100][100],n,i,j,nr,k,l;
int main()
{freopen("laser.in","r",stdin);
 freopen("laser.out","w",stdout);
 scanf("%d",&n);
 int x,y;
 double u;
 for(i=1;i<=n;i++){
 scanf("%d %d",&x,&y);
 u=atan(y*1.0/x)/M_PI*180;
 if(u<0) u=u+360;
 if(x<0) if(y>0) u=u-180;
	  else u=u+180;
 a[i].u1=u;
 scanf("%d %d",&x,&y);
 u=atan(y*1.0/x)/M_PI*180;
 if(u<0) u=u+360;
 if(x<0) if(y>0) u=u-180;
	  else u=u+180;
 a[i].u2=u;
 if(!((a[i].u1>270&&a[i].u2<180)||(a[i].u2>270&&a[i].u1<180)))a[i].b=(a[i].u1+a[i].u2)/2;
 else a[i].b=(a[i].u1+a[i].u2-360)/2;
 if(a[i].b<0) a[i].b+=360;}
 for(i=1;i<=n;i++) scanf("%d",&c[i][max]);

 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   if(i==j) {c[i][++c[i][0]]=j;continue;}
   else {b[i][j]=(a[j].b<=a[i].u1&&a[j].b>=a[i].u2)||(a[j].b>=a[i].u1&&a[j].b<=a[i].u2);
	 if(b[i][j]) c[i][++c[i][0]]=j;}

 for(k=1;k<=n;k++)
 {for(j=1;j<=n;j++)
   if(c[j][0]==1) break;
  if(j>n) break;
  x=c[j][1];   y=c[j][max];
  s[x]=y;  if(y) nr++;
  for(i=1;i<=n;i++)
   for(j=1;j<=c[i][0];j++)
    if(c[i][j]==x)
    {c[i][max]= y? !c[i][max] : c[i][max];
     for(l=j;l<c[i][0];l++)
      c[i][l]=c[i][l+1];
     c[i][0]--;
     break;}}
 printf("%d\n",nr);
 for(i=1;i<=n;i++)
  if(s[i]) printf("%f\n",a[i].b);
 fclose(stdout);
 return 0;}