1. 程式人生 > >POJ 2318 TOYS 叉積

POJ 2318 TOYS 叉積

n) set esp ons space 不能 nbsp poi clas

題意:

給出一個矩形範圍,給出n條線段,這n條線段一定與矩形上下邊界相交且互不相交,將矩形分成n+1個劃分。給出m個玩具的坐標。求每個劃分放的玩具數,玩具保證不會在線段和左右邊界上。

分析:

判斷點是否在兩條直線中間,利用叉積,如果在兩條直線間,必定會有兩個叉積一個小於0,一個大於0(不能把相乘小於0作為判斷條件)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn=5000+5;
int cnt[maxn];

struct Point { int x,y; Point() {}; Point(int xx,int yy) { x=xx; y=yy; } } Up[maxn],Lp[maxn],toys[maxn]; int crs_prdct(Point a,Point b) { return a.x*b.y-b.x*a.y; } Point vct(Point a,Point b) { return Point(a.x-b.x,a.y-b.y); } int main() {
// freopen("in.txt","r",stdin); int n,m,x1,y1,x2,y2; while(scanf("%d",&n),n) { memset(cnt,0,sizeof(cnt)); scanf("%d",&m); scanf("%d%d",&x1,&y1); scanf("%d%d",&x2,&y2); Up[0]=Point(x1,y1); Up[n+1]=Point(x2,y1); Lp[
0]=Point(x1,y2); Lp[n+1]=Point(x2,y2); for(int i=1; i<=n; i++) { int Ui,Li; scanf("%d%d",&Ui,&Li); Up[i]=Point(Ui,y1); Lp[i]=Point(Li,y2); } for(int i=0; i<m; i++) scanf("%d%d",&toys[i].x,&toys[i].y); for(int i=0; i<m; i++) { Point vct1,vct2,vct3,vct4; for(int j=0;j<=n; j++) { vct1=vct(Lp[j],toys[i]); vct2=vct(Up[j],toys[i]); vct3=vct(Lp[j+1],toys[i]); vct4=vct(Up[j+1],toys[i]); if(crs_prdct(vct1,vct2)<0 && crs_prdct(vct3,vct4)>0) { cnt[j]++; break; } } } for(int i=0;i<=n;i++) printf("%d: %d\n",i,cnt[i]); puts(""); } return 0; }

POJ 2318 TOYS 叉積