Pagini recente » Cod sursa (job #1568193) | Cod sursa (job #2205671) | Cod sursa (job #2036991) | Cod sursa (job #2535336) | Cod sursa (job #1252321)
#include<cstdio>
#include<bitset>
#include<cmath>
using namespace std;
int j, n, n_sol, nr_unghiuri_utile, a1[530], b1[530], a2[530], b2[530], pos[1030], ap[1030];
double eps, unghiuri_utile[1030], sol[1030], st[530], dr[530];
bitset < 1030 > A[520];
double Det_Unghi(double x, double y)
{
double result = (double)atan2 (y,x) * 180 / M_PI + 90;
if (result < 0) result = 360 + result;
return result;
}
int main()
{
freopen ("laser.in", "r", stdin);
freopen ("laser.out", "w", stdout);
scanf ("%d", &n);
eps = 0.000001;
for (int i=1; i<=n; i++)
{
scanf ("%d %d %d %d", &a1[i], &b1[i], &a2[i], &b2[i]);
double S, D;
S = Det_Unghi ( a1 [ i ] , b1 [ i ] ) ;
D = Det_Unghi ( a2 [ i ] , b2 [ i ] ) ;
if (S < D)
st[i] = S, dr[i] = D;
else
st[i] = D, dr[i] = S;
unghiuri_utile [++ nr_unghiuri_utile] = st[i] + eps;
unghiuri_utile [++ nr_unghiuri_utile] = dr[i] - eps;
}
for (int i=1; i <= n; i++)
{
for (int j=1; j<=nr_unghiuri_utile; j++)
if (unghiuri_utile[j] >= st[i] && unghiuri_utile[j] <= dr[i])
A[i][j] = 1;
A[i][nr_unghiuri_utile + 1] = 1;
}
for (int i=1; i<=n; i++)
{
int p = 0;
for (j=1; j<=nr_unghiuri_utile + 1; j++)
if (A[i][j])
{
p = j;
break;
}
pos[i] = p;
if (p == 0) continue;
for (int j=1; j<=n; j++)
if (i != j && A[j][p])
A[j] ^= A[i];
}
for (int i=1; i<=n; i++)
if (A[i][nr_unghiuri_utile + 1])
ap[pos[i]] = 1;
for (int i=1; i<=nr_unghiuri_utile; i++)
if (ap[i])
sol[++n_sol] = unghiuri_utile[i];
printf ("%d\n", n_sol);
for (int i=1; i<=n_sol; i++)
printf ("%.4lf\n", sol[i]);
return 0;
}