Pagini recente » Cod sursa (job #1927562) | Cod sursa (job #2465859)
#include <iostream>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int N=515;
const double PI=3.14159265359;
const double EPS=0.00001;
int mat[N][2*N];
int sol[2*N];
double deg(double rad){
return rad*180/PI;
}
double makepoz(double rad){
if(rad<0)
rad+=2*PI;
return rad;
}
struct coord{
int x,y;
};
vector<double> ans;
coord v[N][2];
int main()
{
FILE*fin,*fout;
fin=fopen("laser.in","r");
fout=fopen("laser.out","w");
int n;
fscanf(fin,"%d",&n);
for(int i=1;i<=n;i++){
fscanf(fin,"%d%d%d%d",&v[i][0].x,&v[i][0].y,&v[i][1].x,&v[i][1].y);
}
for(int i=1;i<=n;i++){
double rad1,rad2;
rad1=min(makepoz(atan2(v[i][0].y,v[i][0].x)),makepoz(atan2(v[i][1].y,v[i][1].x)));
rad2=max(makepoz(atan2(v[i][0].y,v[i][0].x)),makepoz(atan2(v[i][1].y,v[i][1].x)));
for(int j=1;j<=n;j++){
for(int k=0;k<=1;k++){
double rad=makepoz(atan2(v[j][k].y,v[j][k].x));
if(rad-rad1>=-EPS && rad-rad2<=EPS){
mat[i][j+k*n]=1;
}
}
}
}
for(int i=1;i<=n;i++){
fscanf(fin,"%d",&mat[i][2*n+1]);
}
int lin=1,poz=1;
while(lin<=n && poz<=2*n+1){
int l=lin;
for(l=lin;l<=n;l++){
if(mat[l][poz]>0){
break;
}
}
if(l==n+1){
poz++;
continue;
}
if(l!=lin){
for(int i=poz;i<=2*n+1;i++)
swap(mat[lin][i],mat[l][i]);
}
for(int i=lin+1;i<=n;i++){
if(mat[i][poz]){
for(int j=poz;j<=2*n+1;j++)
mat[i][j]^=mat[lin][j];
}
}
lin++;
poz++;
}
for(int i=n;i>=1;i--){
for(int j=1;j<=2*n+1;j++){
if(mat[i][j]){
if(j==2*n+1){
fprintf(fout,"0\n");
return 0;
}
sol[j]=mat[i][2*n+1];
for(int k=2*n;k>j;k--)
sol[j]^=(sol[k]*mat[i][k]);
if(sol[j]==1){
if(j>n){
double rad=makepoz(atan2(v[j-n][1].y,v[j-n][1].x));
ans.push_back(deg(rad));
}
else{
double rad=makepoz(atan2(v[j][0].y,v[j][0].x));
ans.push_back(deg(rad));
}
}
break;
}
}
}
fprintf(fout,"%d\n",ans.size());
for(auto x:ans){
fprintf(fout,"%.6f\n",x);
}
return 0;
}