POJ 2398 Toy Storage

#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];
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);
    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;
        sort(U,U+n+2);
        sort(L,L+n+2);
        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++) Ans[ans[i]]++;
        printf("Box
");
        for(int i=1;i<=n;i++)
            if(Ans[i]) printf("%d: %d
",i,Ans[i]);

    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/4925934.html