POJ 2318 TOYS
简单计算几何,用叉积判断点是否在四边形内部。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=5000+10; int n,m,X1,Y1,X2,Y2; int U[maxn],L[maxn]; int ans[maxn]; bool flag[maxn]; struct Point { int x,y; } p[maxn]; char s[10000]; void init() { memset(flag,0,sizeof flag); memset(ans,0,sizeof ans); } int F(int a1,int b1,int a2,int b2) { //返回向量(a1,b1)与向量(a2,b2)的叉积 return a1*b2 - a2*b1; } bool judge(int a1,int b1,int a2,int b2,int a3,int b3,int a4,int b4,int A,int B) { if(F(a2-a1,b2-b1,A-a1,B-b1)>0) return 0; if(F(a3-a2,b3-b2,A-a2,B-b2)>0) return 0; if(F(a4-a3,b4-b3,A-a3,B-b3)>0) return 0; if(F(a1-a4,b1-b4,A-a4,B-b4)>0) return 0; return 1; } int main() { while(~scanf("%d",&n)) { if(!n) break; scanf("%d%d%d%d%d",&m,&X1,&Y1,&X2,&Y2); init(); for(int i=1; i<=n; i++) scanf("%d%d",&U[i],&L[i]); U[0]=X1; L[0]=X1; U[n+1]=X2; L[n+1]=X2; for(int i=1; i<=m; i++) scanf("%d%d",&p[i].x,&p[i].y); for(int i=0; i<=n; i++) { for(int j=1; j<=m; j++) { if(flag[j]!=0) continue; if(judge(U[i],Y1,U[i+1],Y1,L[i+1],Y2,L[i],Y2,p[j].x,p[j].y)) flag[j]=1,ans[i]++; } } for(int i=0; i<=n; i++) printf("%d: %d\n",i,ans[i]); printf("\n"); } return 0; }