思路:对于每加入一条线,k=1,判断与之前的线段是否相交,如果是,k++; 然后总的+=k; 注意叉积的运算&&线段相交的判断:快速排斥&&跨立实验! #include<stdio.h> #include<string.h> struct node { int x,y; }tt[100]; int w,h,l,ans; int min(int a,int b) { if(a>b) return b; else return a; } int max(int a,int b) {if(a>b)return a;else return b;} int multi(int a,int b,int c) { return (tt[a].x-tt[b].x)*(tt[c].y-tt[b].y)-(tt[a].y-tt[b].y)*(tt[c].x-tt[b].x); } bool pai(int x1,int y1,int x2,int y2) { bool flag=true; if(min(tt[x1].x,tt[y1].x)>max(tt[x2].x,tt[y2].x)) flag=false; if(min(tt[x2].x,tt[y2].x)>max(tt[x1].x,tt[y1].x)) flag=false; if(min(tt[x1].y,tt[y1].y)>max(tt[x2].y,tt[y2].y)) flag=false; if(min(tt[x2].y,tt[y2].y)>max(tt[x1].y,tt[y1].y)) flag=false; return flag; } bool find(int x1,int y1,int x2,int y2) { if(pai(x1,y1,x2,y2)&&(multi(x1,x2,y2)*multi(y1,x2,y2)<0)&&(multi(x2,x1,y1)*multi(y2,x1,y1)<0)) return true; return false; } void solve() { int i,j,k; ans=2; for(i=2;i<l+1;i++) { k=1; for(j=0;j<i;j++) { if(find(i-1,i,j,j+1)) { k++; } } ans=ans+k; } printf("%d/n",ans); } int main() { while(scanf("%d%d",&w,&h)!=EOF) { if(w==0&&h==0) break; scanf("%d",&l); int i; for(i=0;i<l+1;i++) { scanf("%d%d",&tt[i].x,&tt[i].y); } solve(); } return 0; }