Cod sursa(job #1399578)

Utilizator oana28Oana Mitoiu oana28 Data 24 martie 2015 20:16:09
Problema Laser Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#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];
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=1;i<=n;++i)
        if (A[i][n+1])
        {
            ++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;
}