分析:按顺序给你n边形的n个坐标,和一些点的坐标,让你判断这些点是不是在多边形内。用改进弧长法来求解比较好,原理可参看网上的,下面附我写的代码。
# include <stdio.h> typedef struct point { int x,y; }Point; Point v[105]; int main() { int i,n,m,cur,nex,ans,f,t=1; Point p; while(scanf("%d",&n),n) { scanf("%d",&m); for(i=1;i<=n;i++) scanf("%d%d",&v[i].x,&v[i].y); if(t!=1) putchar('\n'); printf("Problem %d:\n",t++); while(m--) { scanf("%d%d",&p.x,&p.y); for(i=1;i<=n;i++) v[i].x-=p.x,v[i].y-=p.y; nex=v[1].x>=0?(v[1].y>=0?1:4):(v[1].y>=0?2:3); for(i=1,ans=0;i<=n;i++) { f=v[i].x*v[i%n+1].y-v[i%n+1].x*v[i].y; if((!v[i].x&&!v[i].y)||(!f&&v[i].x*v[i%n+1].x<=0&&v[i].y*v[i%n+1].y<=0)) break; cur=nex; nex=v[i%n+1].x>=0?(v[i%n+1].y>=0?1:4):(v[i%n+1].y>=0?2:3); if(cur%4+1==nex) ans+=1; else if(cur%4+2==nex||cur%4-2==nex) ans+=(f>0?2:-2); else if(nex%4+1==cur) ans-=1; } if(i<=n||ans) printf("Within\n"); else printf("Outside\n"); for(i=1;i<=n;i++) v[i].x+=p.x,v[i].y+=p.y; } } return 0; }