Foj 2148 二维几何(点是否在三角形内)

题目大意:给n个坐标(不存在三点共线的点),求能够组成多少个凸四边形。

 

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

struct Point
{
    int x,y;
    Point(int x=0,int y=0):x(x),y(y){}
}p[35];

typedef Point Vector;

Vector operator - (Vector A, Vector B){ return Vector(A.x-B.x,A.y-B.y);}

int AbsCross(Vector A,Vector B){ return fabs(A.x*B.y-A.y*B.x);}

Point read_point()
{
    Point p1;
    scanf("%d %d",&p1.x,&p1.y);
    return p1;
}

bool fun(int i,int j,int k,int m)
{
    int area1,area2,area3,area4,sum;
    area1=AbsCross(p[j]-p[i],p[k]-p[i]);
    area2=AbsCross(p[j]-p[i],p[m]-p[i]);
    area3=AbsCross(p[k]-p[i],p[m]-p[i]);
    area4=AbsCross(p[k]-p[j],p[m]-p[j]);
    sum=area2+area3+area4;
    if(sum!=area1) return true;
    return false;
}

bool is_ok(int i,int j,int k,int m)
{
    if(!fun(i,j,k,m)) return false;
    if(!fun(i,j,m,k)) return false;
    if(!fun(i,k,m,j)) return false;
    if(!fun(j,k,m,i)) return false;
    return true;
}

int main()
{
    int i,j,k,m,n,T,Icase,ans;
    scanf("%d",&T);
    for(Icase=1;Icase<=T;Icase++)
    {
        ans=0;
        scanf("%d",&n);
        for(i=0;i<n;i++) p[i]=read_point();
        for(i=0;i<n-3;i++)
        {
            for(j=i+1;j<n-2;j++)
            {
                for(k=j+1;k<n-1;k++)
                {
                    for(m=k+1;m<n;m++)
                    {
                        if(is_ok(i,j,k,m))
                            ans++;
                    }
                }
            }
        }
        printf("Case %d: %d\n",Icase,ans);
    }
    return 0;
}

 

 

 

posted on 2014-03-14 19:01  雄..  阅读(191)  评论(0编辑  收藏  举报

导航