题目描述
欢迎参加程序设计竞赛~
程序设计竞赛中有着很多有意思的问题,其中,与三角形有关的问题就经常出现。今天你要解决的,就是其中最简单的一个问题:
给定平面直角坐标系上的N个点,保证这N个点中任意三点都不共线。求任意三点能够构成的三角形中,面积最大的三角形的面积。
输入
输入的第一行是一个整数T(1 <= T <= 10),表示一共有T组用例。
每组用例的第一行为一个整数N(3 <= n <= 100),表示平面上点的个数。接下来的N行,每行包含两个用空格隔开的整数Xi和Yi(-1000 <= Xi, Yi <= 1000),表示第i个点的坐标(Xi, Yi)。
输出
每组用例输出一个数,表示最大的三角形的面积,结果保留一位小数。
输入样例
2
4
-1 1
1 1
1 -1
-1 -1
3
-1 -1
3 0
0 0
输出样例
2.0
1.5
完整代码
#include <stdio.h>
#include <math.h>
typedef struct dot
{
int no,x,y;
}DOT;
float calculate(DOT a,DOT b,DOT c)
{
return 1.0*fabs((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x))/2;
}
void seek(DOT *p,DOT *s,DOT *q,float *m,int n)
{
float B=0;
if(p->no<n-1)
if(s->no<n)
if(q->no)
{
B=calculate(*p,*s,*q);
if(*m<B) *m=B;q++;seek(p,s,q,m,n);
}
else { s++;seek(p,s,s+1,m,n);}
else { p++;seek(p,p+1,p+2,m,n);}
}
main()
{
int t,n,i;static DOT d[100];float A;
scanf("%d",&t);
while(t--)
{
A=0;scanf("%d",&n);
for(i=0;i<n;i++)
{ d[i].no=i+1;scanf("%d %d",&d[i].x,&d[i].y);}
seek(d,&d[1],&d[2],&A,n);
printf("%.1f\n",A);
}
}