FOJ 2148(求凸四边形数量)

来源:互联网 发布:软件开发人员外派 编辑:程序博客网 时间:2024/05/16 15:39

题意:给n个点,求图中凸四边形的数量。


解法:n<=30,就暴力吧。n^4 ^_^。如果四个点构成一个凸四边形,那么任意一个点和其他三个点组成的三个三角形面积一定大于其余三个点组成的三角形面积大。


代码:

#include <iostream>#include <stdio.h>using namespace std;struct point{    int x,y;} points[40];int abs(int k){if(k<0) return -k;return k;}int mult(point a,point b,point c){    a.x-=c.x;    a.y-=c.y;    b.x-=c.x;    b.y-=c.y;    return abs(a.x*b.y-a.y*b.x);}bool OK(point a,point b,point c,point d){    if(mult(a,b,c)+mult(a,c,d)+mult(a,b,d)<=mult(b,c,d))        return false;    if(mult(b,a,c)+mult(b,c,d)+mult(b,a,d)<=mult(a,c,d))        return false;    if(mult(c,a,b)+mult(c,b,d)+mult(c,a,d)<=mult(a,b,d))        return false;    if(mult(d,a,b)+mult(d,b,c)+mult(d,a,c)<=mult(a,b,c))        return false;    return true;}int n;int main(){   int t;cin>>t;int an=1;   while(t--)   {      cin>>n;      for(int i=0;i<n;i++)        scanf("%d%d",&points[i].x,&points[i].y);        int ans=0;      for(int i=0;i<n;i++)        for(int j=i+1;j<n;j++)        for(int k=j+1;k<n;k++)        for(int h=k+1;h<n;h++)      {          if(OK(points[i],points[j],points[k],points[h]))            ans++;      }      printf("Case %d: %d\n",an,ans);an++;   }    return 0;}

0 0