标签:
题意:给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数。
题解:通过斜率判断一个点是否在两条线段之间。
/**
通过斜率比较点是否在两线段之间
*/
#include"iostream"
#include"cstdio"
#include"algorithm"
#include"cstring"
using namespace std;
const int N=1005;
struct edgeP //边上的一个点
{
int x1,x2;
}e[N];
struct point
{
int x,y;
}p[N];
int cmp(edgeP a,edgeP b)
{
return a.x1<=b.x1;
}
int x1,y1,x2,y2;
bool is_z(point e1,point e2) // /型斜线
{
if((e1.y-e2.y)*(e1.x-e2.x)>=0)
return true;
else
return false;
}
bool is_f(point e1,point e2) // \型斜线
{
if((e1.y-e2.y)*(e1.x-e2.x)<=0)
return true;
else
return false;
}
bool is_inzr(point e1,point e2,point p) // 在/型斜线的右边
{
if((e1.y-e2.y)*(e1.x-e2.x)>=0)
{
if((p.x-e2.x>0)&&(e1.y-e2.y)*(p.x-e2.x)>(p.y-e2.y)*(e1.x-e2.x))
return true;
}
return false;
}
bool is_infl(point e1,point e2,point p) // 在\型斜线的左边
{
if((e1.y-e2.y)*(e1.x-e2.x)<=0)
{
if((p.x-e2.x<0)&&(e1.y-e2.y)*(p.x-e2.x)<(p.y-e2.y)*(e1.x-e2.x))
return true;
}
return false;
}
bool is_in(point e1,point e2,point e3,point e4,point p) // 点是否在两线内
{
if((is_z(e1,e2)&&is_inzr(e1,e2,p))&&(is_f(e3,e4)&&is_infl(e3,e4,p))) // 点在/.\型两线间
return true;
if((is_z(e1,e2)&&is_inzr(e1,e2,p))&&(is_z(e3,e4)&&!is_inzr(e3,e4,p))) // 点在/./型两线间
return true;
if((is_f(e1,e2)&&!is_infl(e1,e2,p))&&(is_f(e3,e4)&&is_infl(e3,e4,p))) //点在\.\型两线间
return true;
if((is_f(e1,e2)&&!is_infl(e1,e2,p))&&(is_z(e3,e4)&&!is_inzr(e3,e4,p))) //点在\./型两线间
return true;
return false;
}
int main()
{
int n,m;
while(cin>>n)
{
if(n==0)
return 0;
e[0].x1=0,e[0].x2=0;
cin>>m>>x1>>y1>>x2>>y2;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&e[i].x1,&e[i].x2);
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
e[n+1].x1=x2,e[n+1].x2=x2;
sort(e,e+n+2,cmp);
int cnt[N];
memset(cnt,0,sizeof(cnt));
for(int i=0;i<=n;i++)
{
for(int j=0;j<m;j++)
{
point e1,e2;
e1.x=e[i].x1,e1.y=y1;
e2.x=e[i].x2,e2.y=y2;
point e3,e4;
e3.x=e[i+1].x1,e3.y=y1;
e4.x=e[i+1].x2,e4.y=y2;
/*{
cout<<'('<<e1.x<<','<<e1.y<<')'<<" "<<'('<<e2.x<<','<<e2.y<<')'<<endl;
cout<<'('<<e3.x<<','<<e3.y<<')'<<" "<<'('<<e4.x<<','<<e4.y<<')'<<endl;
cout<<'('<<p[j].x<<','<<p[j].y<<')'<<endl;
}*/
if(is_in(e1,e2,e3,e4,p[j]))
{
cnt[i]++;
//cout<<"cnt"<<i<<"++++++++++++++++++++++"<<endl;
}
}
//cout<<"-------------------------------------------"<<endl;
}
/*for(int i=0;i<=n;i++)
{
cout<<cnt[i]<<' ';
}*/
sort(cnt,cnt+n+1);
puts("Box");
int j=cnt[0],count=1;
cnt[n+1]=-10;
for(int i=1;i<=n+1;i++)
{
if(cnt[i]==j)
{
count++;
}
else
{
if(j!=0)
printf("%d: %d\n",j,count);
j=cnt[i];
count=1;
}
}
}
}
Description
Input
Output
Sample Input
4 10 0 10 100 0 20 20 80 80 60 60 40 40 5 10 15 10 95 10 25 10 65 10 75 10 35 10 45 10 55 10 85 10 5 6 0 10 60 0 4 3 15 30 3 1 6 8 10 10 2 1 2 8 1 5 5 5 40 10 7 9 0
Sample Output
Box 2: 5 Box 1: 4 2: 1
标签:
原文地址:http://blog.csdn.net/strangedbly/article/details/51363836