NYOJ 952 最大四边形 (n个点求组成四边形的最大面积)

最大四边形

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述
平面坐标上有n个点,你知道能组成四边形中面积最大的是多少吗?
输入
有多组测试数据
第一行整数n,表示有n个点,( 4<=n<=300 )
然后n行,每行x,y表示点的坐标。(没有重复的点)
输出
最大四边形的面积.(保留六位小数)
样例输入
5
0 0
0 4
4 0
4 4
2 3
样例输出
16.000000

  

思路:枚举每两个点组成的边,然后再枚举每个点和这条边组成的三角形的面积,通过判断点和直线的关系,来确定是在边的哪边,然后所记录的两边的三角形的最大值相加,就是组成的四边形的面积

ac代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define MAXN 1010
#define fab(a) (a)>0?(a):(-a)
#define INF 0xfffffff
#define LL long long
#define mem(x) memset(x,0,sizeof(x))
using namespace std;
struct  s
{
	double x,y;
}list[MAXN];
double area(s a,s b,s c)
{
    return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
int main()
{
	int n;
	int i,j,k;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;i++)
		scanf("%lf%lf",&list[i].x,&list[i].y);
		double ans=0;
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				if(i==j)
				continue;
				double M1=0,M2=0;
				for(k=0;k<n;k++)
				{
					if(k==i||k==j)
					continue;
					double a=list[i].y-list[j].y,b=list[j].x-list[i].x,c=list[i].x*list[j].y-list[j].x*list[i].y;
					double temp;
					temp=a*list[k].x+b*list[k].y+c;
					if(temp>0)
					{
						M1=max(fab(area(list[i],list[j],list[k])/2),M1);
					}
					else if(temp<0)
					{
						M2=max(fab(area(list[i],list[j],list[k])/2),M2);
					}
				}
				if(M1==0||M2==0)//不能组成四边形,即有三点共线
				continue;
				ans=max(ans,M1+M2);
			}
		}
		printf("%.6lf\n",ans);
	}
    return 0;
} 


你可能感兴趣的:(NYOJ 952 最大四边形 (n个点求组成四边形的最大面积))