Pagini recente » Cod sursa (job #2666262) | Cod sursa (job #2054642) | Cod sursa (job #947183) | Cod sursa (job #2214088) | Cod sursa (job #2482036)
#include <fstream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#define ver 0.000000001
#define P 3.14159265358979323846264338327950288
using namespace std;
ifstream fin ("laser.in");
ofstream fout("laser.out");
int n,m,x1,x2,y3,y2,i,j,x,y,a[1100][1100],sol[1100],t;
double segs[520],segd[520],v[1100],st,dr,ung[1100];
int verif()
{
if(segd[i]-segs[i]<P+ver)
return (v[j]-segs[i]>=-ver&&segd[i]-v[j]>=-ver);
return (v[j]<=segs[i]+ver&&v[j]>=-ver)||(v[j]>=segd[i]-ver&&v[j]-P>=-ver);
}
int main ()
{
fin>>n;
for(i=1;i<=n;i++)
{
fin>>x1>>y3>>x2>>y2;
st=atan2(y3,x1);
if(st<0) st+=2*P;
dr=atan2(y2,x2);
if(dr<0) dr+=2*P;
v[i*2-1]=st;v[i*2]=dr;
if(st-dr>ver) swap(st,dr);
segs[i]=st;segd[i]=dr;
}
m=2*n;
sort(v+1,v+m+1);
for(i=1;i<m;i++) ung[i]=(v[i]+v[i+1])/2;
ung[m]=2*P-ver;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
a[i][j]=verif();
for(i=1;i<=n;i++) fin>>a[i][m+1];
x=1;y=1;
while(x<=n&&y<=m)
{
for(i=x;i<=n;i++) if(a[i][y]!=0) break;
if(i==n+1)
{
y++;
continue;
}
if(i!=x) for(j=1;j<=m+1;j++)
swap(a[x][j],a[i][j]);
for(i=x+1;i<=n;i++)
if(a[i][y])
for(j=y;j<=m+1;j++)
a[i][j]^=a[x][j];
x++;y++;
}
int ok=0,nr=0;
for(i=n;i>=1;i--)
{
for(j=1;j<=m+1;j++) if(a[i][j]) break;
if(j==m+2)
continue;
if(j==m+1)
{
ok=-1;
break;
}
sol[j]=a[i][m+1];
for(t=j+1;t<=m;t++)
sol[j]^=sol[t]*a[i][t];
if(sol[j]==1) nr++;
}
if(ok==-1) return 0;
fout<<nr<<"\n";
for(i=1;i<=m;i++)
if(sol[i]==1) fout<<fixed<<setprecision(6)<<ung[i]*180/P<<"\n";
return 0;
}