您的位置:首页 > 其它

FOJ 2148(求凸四边形数量)

2014-01-23 23:30 330 查看
题意:给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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: