我永远不会忘记今天2017.8.13,一道计算几何从上午写完,改到下午4点半,出不来,然后换了一道水一点的这题,然后把变量名全改的更kuangbin的一样,二分对比代码查错,最后一个y1写成x2,一个if();的括号后面写了个分号,吐得血出
全程抄写kuangbin代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define maxl 110
#define eps 1e-8
using namespace std;
int sgn(double x)
{
if(fabs(x)<eps) return 0;
if(x<0)
return -1;
else
return 1;
}
int n,ans;
struct point
{
double x,y;
point(double a=0,double b=0)
{
x=a;y=b;
}
point operator - (const point &b) const
{
return point(x-b.x,y-b.y);
}
double operator ^ (const point &b) const
{
return x*b.y-y*b.x;
}
double operator * (const point &b) const
{
return x*b.x+y*b.y;
}
void transxy(double b)
{
double tx=x,ty=y;
x=tx*cos(b)-ty*sin(b);
y=tx*sin(b)+ty*cos(b);
}
} s;
point p[maxl];
struct line
{
point s,e;
double k;
line () {}
line(point a,point b)
{
s=a;e=b;
k=atan2(e.y-s.y,e.x-s.x);
}
pair<int,point> operator & (const line &b) const
{
point res=s;
if(sgn((s-e)^(b.s-b.e))==0)
{
if(sgn((s-b.e)^(b.s-b.e))==0)
return make_pair(0,res);
else
return make_pair(1,res);
}
double t=((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));
res.x+=(e.x-s.x)*t;
res.y+=(e.y-s.y)*t;
return make_pair(2,res);
}
}a[maxl];
double dist(point a,point b)
{
return sqrt((a-b)*(a-b));
}
bool inter(line l1,line l2)
{
return
max(l1.s.x,l1.e.x)>=min(l2.s.x,l2.e.x) &&
max(l2.s.x,l2.e.x)>=min(l1.s.x,l1.e.x) &&
max(l1.s.y,l1.e.y)>=min(l2.s.y,l2.e.y) &&
max(l2.s.y,l2.e.y)>=min(l1.s.y,l2.e.y) &&
sgn((l2.s-l1.s)^(l1.e-l1.s))*sgn((l2.e-l1.s)^(l1.e-l1.s))<=0 &&
sgn((l1.s-l2.s)^(l2.e-l1.s))*sgn((l1.e-l2.s)^(l2.e-l2.s))<=0;
}
void prework()
{
double x1,x2,y1,y2;
for(int i=1;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
a[i]=line(point(x1,y1),point(x2,y2));
p[2*i-1]=point(x1,y1);
p[2*i]=point(x2,y2);
}
scanf("%lf%lf",&x1,&y1);
s=point(x1,y1);
}
void mainwork()
{
ans=1000000;
for(int i=1;i<=2*n;i++)
{
int tmp=0;
line l1=line(s,p[i]);
for(int j=1;j<=n;j++)
if(inter(l1,a[j]))
tmp++;
ans=min(ans,tmp);
}
line l1;
l1=line(s,point(0,0));
int tmp=0;
for(int i=1;i<=n;i++)
if(inter(l1,a[i]))
tmp++;
ans=min(ans,tmp+1);
l1=line(s,point(0,100));
tmp=0;
for(int i=1;i<=n;i++)
if(inter(l1,a[i]))
tmp++;
ans=min(ans,tmp+1);
l1=line(s,point(100,0));
tmp=0;
for(int i=1;i<=n;i++)
if(inter(l1,a[i]))
tmp++;
ans=min(ans,tmp+1);
l1=line(s,point(100,100));
tmp=0;
for(int i=1;i<=n;i++)
if(inter(l1,a[i]))
tmp++;
ans=min(ans,tmp+1);
}
void print()
{
printf("Number of doors = %d\n",ans);
}
int main()
{
while(~scanf("%d",&n))
{
prework();
mainwork();
print();
}
}