http://acm.hdu.edu.cn/showproblem.php?pid=4709
思路:方法一: 叉积求面积,在三角形ABC中向量AB=( x2-x1, y2-y1 ),向量AC=( x3-x1, y3-y1 )
AB X AC=1/2 *[ (x2-x1) *(y3-y1)-(y2-y1)*(x3-x1) ]
方法二:海伦公式,通过向量不共线来确定三角形。
方法一:
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
double X[128];
double Y[128];
double ff(int i,int j,int k)
{
return fabs(X[i]*Y[j]+Y[i]*X[k]+X[j]*Y[k]-X[k]*Y[j]-X[j]*Y[i]-X[i]*Y[k])/2;
}
int main(){
int T;
int N;
int i,j,k;
double a,b,c;
double S;
double area;
double mi_area;
scanf("%d",&T);
while(T--){
scanf("%d",&N);
for(i=0;i<N;++i){
scanf("%lf%lf",&X[i],&Y[i]);
}
area=0;
mi_area=-1;
for(i=0;i<N;++i){
for(j=i+1;j<N;++j){
for(k=j+1;k<N;++k){
area=ff(i,j,k);
//printf("%lf\n",area);
if(area!=0){
if(area<mi_area||mi_area<0){
mi_area=area;
}
}
}
}
}
if(mi_area<0){
printf("Impossible\n");
}
else{
printf("%.2f\n",mi_area);
}
}
return 0;
}
方法二:
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
#define F 1e-17
double X[128];
double Y[128];
int main(){
int T;
int N;
int i,j,k;
double a,b,c;
double S;
double area;
double mi_area;
scanf("%d",&T);
while(T--){
scanf("%d",&N);
for(i=0;i<N;++i){
scanf("%lf%lf",&X[i],&Y[i]);
}
mi_area=-1;
for(i=0;i<N;++i){
for(j=i+1;j<N;++j){
for(k=j+1;k<N;++k){
if( fabs( (X[j]-X[i]) * (Y[k]-Y[i]) - (X[k]-X[i]) * (Y[j]-Y[i]) ) < F )
continue;
a=sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]));
b=sqrt((X[i]-X[k])*(X[i]-X[k])+(Y[i]-Y[k])*(Y[i]-Y[k]));
c=sqrt((X[j]-X[k])*(X[j]-X[k])+(Y[j]-Y[k])*(Y[j]-Y[k]));
S=(a+b+c)/2;
area=sqrt(S*(S-a)*(S-b)*(S-c));
if(area<mi_area||mi_area<0)
{
mi_area=area;
}
}
}
}
if(mi_area<0){
printf("Impossible\n");
}
else{
printf("%.2f\n",mi_area);
}
}
return 0;
}