ZOJ 1081 Points Within
2015-08-13 20:42
369 查看
分析:按顺序给你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; }
相关文章推荐
- leetcode Balanced Binary Tree 平衡二叉树判定
- 数组操作
- WPf中多线程改UI
- [leetcode] two sum
- HDU 5099 Comparison of Android versions【字符串+模拟】
- http://zzgthk.iteye.com/blog/1064434
- cocos2d-x由Jni实现Java与C++打电话给对方
- Android-应用开发-广播和服务(八)
- cell的自适应高度
- poj3685 多重二分
- poj 2253 Frogger
- Java内存详解
- [STL系列]开篇简单介绍
- Skype for Business 使用之SKYPE目录
- 8月13日GDOI模拟总结
- 矩阵乘法计算量计算(stack + 结构体)
- Mybatis/Ibatis,数据库操作的返回值
- 继承
- 小鑫找基友 SDUT 3115
- 对你的再次认识——机房的整体分析