题目与POJ2318基本一样
不同之处是需要对直线位置从左到右(按照平面直角坐标系的习惯)进行排序,最后对结果进行统计即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 1000+10
struct point
{
int x,y;
};
struct Line
{
point a,b;
};
int n;
int ans[maxn];
int cnt[maxn];
Line line[maxn];
using namespace std;
void output()
{
cout<<"Box"<<endl;
for(int i=0;i<=n;i++)
{
if(ans[i]!=0)
cnt[ans[i]]++;
}
for(int i=0;i<=n;i++)
{
if(cnt[i]!=0)
printf("%d: %d\n",i,cnt[i]);
}
}
bool cmp(Line l1,Line l2)
{
if(l1.a.x<l2.a.x && l1.b.x<l2.b.x)
return true;
else
return false;
}
int cross(point p0,point p1,point p2)
{
return (p0.x-p2.x)*(p1.y-p2.y)-(p1.x-p2.x)*(p0.y-p2.y);
}
void search(point toy)
{
for(int i=0;i<=n;i++)
{
if(cross(toy,line[i].a,line[i].b)>0 && cross(toy,line[i+1].a,line[i+1].b)<0)
ans[i]++;
}
}
int main()
{
int m,x1,y1,x2,y2;
int u,l,xj,yj;
point toy;
while(scanf("%d",&n) && n!=0)
{
memset(ans,0,sizeof(ans));
memset(cnt,0,sizeof(cnt));
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
line[0].a.x=x1; line[0].a.y=y1;
line[0].b.x=x1;line[0].b.y=y2;
line[n+1].a.x=x2; line[n+1].a.y=y1;
line[n+1].b.x=x2; line[n+1].b.y=y2;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&u,&l);
line[i].a.x=u;
line[i].a.y=y1;
line[i].b.x=l;
line[i].b.y=y2;
}
sort(line+1,line+n+1,cmp);
for(int i=0;i<m;i++)
{
scanf("%d%d",&xj,&yj);
toy.x=xj;
toy.y=yj;
search(toy);
}
/*
for(int i=0;i<=n;i++)
printf("%d: %d\n",i,ans[i]);
cout<<endl;*/
output();
}
}