ZOJ 1081 Points Within

来源:互联网 发布:西门子工业软件怎么样 编辑:程序博客网 时间:2024/06/02 02:55

分析:按顺序给你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;  }


0 0
原创粉丝点击