首页 > 其他 > 详细

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

时间:2014-03-15 06:47:12      阅读:435      评论:0      收藏:0      [点我收藏+]

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

 

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

Foj 2148 二维几何(点是否在三角形内),布布扣,bubuko.com

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

原文:http://www.cnblogs.com/xiong-/p/3601161.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!