#include<iostream> using namespace std; #include<cstdio> struct point { int x,y; }; struct segment { point a,b; }; segment s[55]; int multi(point p1,point p2,point p0) { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } bool seg(segment u,segment v) { if( min(u.a.x,u.b.x)<=max(v.a.x,v.b.x)&& min(v.a.x,v.b.x)<=max(u.a.x,u.b.x)&& min(u.a.y,u.b.y)<=max(v.a.y,v.b.y)&& min(v.a.y,v.b.y)<=max(u.a.y,u.b.y)&& multi(u.b,v.a,u.a)*multi(u.b,v.b,u.a)<0&& multi(v.b,u.b,v.a)*multi(v.b,u.a,v.a)<0) return true; else return false; } int main() { int w,h,len,i,j,count,temp; point p[60]; while(scanf("%d%d",&w,&h)) { if(w==0&&h==0) break; scanf("%d",&len); for(i=1;i<=len+1;i++) scanf("%d%d",&p[i].x,&p[i].y); for(i=1;i<=len;i++) { s[i].a=p[i],s[i].b=p[i+1]; } count=2; for(i=2;i<=len;i++) { temp=1; for(j=1;j<i-1;j++) { if(seg(s[i],s[j])) temp++; } count+=temp; } printf("%d/n",count); } return 0; } 直接附上AC代码了,唯一要注意的地方就是multi(u.b,v.a,u.a)*multi(u.b,v.b,u.a)<0,这里不用加等号,