#include<iostream> #define MAX 50 using namespace std; typedef struct Piont { double x,y; }point; typedef struct Zx { point start,end; }zx; int max(int x,int y) { return x>y? x:y; } int min(int x,int y) { return x<y? x:y; } double multi(point p0,point p1,point p2)//计算矢量[p0,p1], [p0,p2] 的叉积 { return (p1.x-p0.x)*(p2.y-p0.y) -(p2.x-p0.x)*(p1.y-p0.y); } bool is_cross(point s1,point e1,point s2,point e2)//判断直线相交 { return max(s1.x,e1.x)>=min(s2.x,e2.x)&& max(s2.x,e2.x)>=min(s1.x,e1.x)&& max(s1.y,e1.y)>=min(s2.y,e2.y)&& max(s2.y,e2.y)>=min(s1.y,e1.y)&& multi(s2,e1,s1)*multi(e1,e2,s1)>=0&& multi(s1,e2,s2)*multi(e2,e1,s2)>=0;//加了等号就包括 端点相交 } zx z[MAX]; int main() { int n,i,j,min=-1,door1=0,door2=0; point T; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { scanf("%lf%lf%lf%lf",&z[i].start.x,&z[i].start.y, &z[i].end.x,&z[i].end.y); } scanf("%lf%lf",&T.x,&T.y); for(i=1;i<=n;i++) { for(j=1;j<=n;j++)//枚举墙上的每一个点 { if(is_cross(T,z[i].start,z[j].start,z[j].end)) door1++; if(is_cross(T,z[i].end,z[j].start,z[j].end)) door2++; } if(min>door1||min==-1) min=door1;door1=0; if(min>door2||min==-1) min=door2;door2=0; } if(n) printf("Number of doors = %d /n",min); else printf("Number of doors = 1 /n");//注意没墙的时候要考虑周到 } return 0; } http://acm.pku.edu.cn/JudgeOnline/problem?id=1066