Pagini recente » Cod sursa (job #656982) | Cod sursa (job #1952509) | Cod sursa (job #2366627) | Cod sursa (job #554821) | Cod sursa (job #1399598)
#include<fstream>
#include<iomanip>
#include<cmath>
using namespace std;
ifstream fin("laser.in");
ofstream fout("laser.out");
const double pi=3.14159265;
struct punct
{
int x,y;
} nul,M[528];
struct segment
{
punct X,Y;
} a[528];
int n,nr,aux,A[528][528],X[528];
double unghi[528];
inline int det(punct A, punct B, punct C)
{
long long r=1LL*(B.x-A.x)*(C.y-A.y)-1LL*(C.x-A.x)*(B.y-A.y);
if (!r) return 0;
if (r<0) return -1;
return 1;
}
inline bool inters(segment A, punct M)
{
int r1=det(nul,A.X,M)*det(nul,A.Y,M);
int r2=det(A.X,A.Y,M)*det(A.X,A.Y,nul);
return r1<=0 && r2<=0;
}
int main()
{
int i,j,k,t;
fin>>n;
for (i=1;i<=n;++i)
{
fin>>a[i].X.x>>a[i].X.y>>a[i].Y.x>>a[i].Y.y;
M[i].x=a[i].X.x+a[i].Y.x, M[i].y=a[i].X.y+a[i].Y.y;
M[i].x*=10000, M[i].y*=10000;
}
for (i=1;i<=n;++i)
fin>>A[i][n+1];
for (i=1;i<=n;++i)
for (j=1;j<=n;++j)
if (inters(a[i],M[j]))
A[i][j]=1;
i=1, j=1;
while (i<=n)
{
for (t=j;t<=n+1;++t)
if (A[i][t])
break;
if (t>n+1)
{
++j;
continue;
}
if (t==n+1)
break;
if (t>j)
{
for (t=i+1;t<=n;++t)
if (A[t][j])
break;
for (k=j;k<=n+1;++k)
aux=A[t][k], A[t][k]=A[i][k], A[i][k]=aux;
}
for (k=i+1;k<=n;++k)
if (A[k][j])
for (t=j;t<=n+1;++t)
A[k][t]^=A[i][t];
++i, ++j;
}
for (i=n;i>0;--i)
{
for (j=1;j<=n;++j)
if (A[i][j])
break;
if (j>n) continue;
X[j]=A[i][n+1];
for (k=j+1;k<=n;++k)
X[j]^=X[k]&A[i][k];
}
for (i=1;i<=n;++i)
if (X[i])
{
++nr;
unghi[nr]=atan2(M[i].y,M[i].x)/pi*180;
if (unghi[nr]<0) unghi[nr]+=360;
}
fout<<nr<<"\n";
for (i=1;i<=nr;++i)
fout<<setprecision(6)<<fixed<<unghi[i]<<"\n";
return 0;
}