题目链接:https://vjudge.net/problem/POJ-1408
题目是叫我们求出所有四边形里最大的那个的面积。
思路:因为这里只给了我们正方形四条边上的点,所以我们要先计算横竖线段两两相交的所有交点,如果不会求两条线段之间的交点的话可以看一下这个博客:https://www.cnblogs.com/elpsycongroo/p/8726513.html
然后再求每一个四边形的面积,要求某个四边形的面积的话,可以先确定四个点中的一个点,这样其他三个点就随之确定了,在这里应该是先确定左下角的点比较方便,得到四个点坐标之后就可以把一个四边形切割成两个三角形,用叉积求三角形面积,然后两个三角形面积相加就是四边形面积了。
我的代码:
#include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<map> #include<stack> #include<cmath> #include<vector> #include<fstream> #include<set> #include<cstdio> using namespace std; #define eps 1e-8 #define ll long long #define INF 0x3f3f3f3f double a[35],b[35],c[35],d[35]; int n,m,cnt; struct point{ double x,y; }p[35][35]; double ans; void read() { for(int i=1;i<=n;i++) scanf("%lf",&a[i]); for(int i=1;i<=n;i++) scanf("%lf",&b[i]); for(int i=1;i<=n;i++) scanf("%lf",&c[i]); for(int i=1;i<=n;i++) scanf("%lf",&d[i]); a[0]=b[0]=0; //四个角上的点的横纵坐标 a[n+1]=b[n+1]=1; c[0]=d[0]=0; c[n+1]=d[n+1]=1; } point cal(double x1,double x2,double y1,double y2)//求交点的函数 { double a1=1,b1=x1-x2,c1=-x1; double a2=y2-y1,b2=-1,c2=y1; double D=a1*b2-a2*b1; point ans; ans.x=(b1*c2-b2*c1)/D; ans.y=(a2*c1-a1*c2)/D; return ans; } void get_point() { for(int i=0;i<=n+1;i++) { for(int j=0;j<=n+1;j++) { p[i][j]=cal(a[i],b[i],c[j],d[j]); } } } double cross(point a,point b,point c)//叉积 { return fabs((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)); } void get_area() { for(int i=0;i<n+1;i++) { for(int j=0;j<n+1;j++) { double area=0; area+=cross(p[i][j],p[i][j+1],p[i+1][j])/2.0; area+=cross(p[i+1][j+1],p[i][j+1],p[i+1][j])/2.0; ans=max(area,ans); } } } int main() { while(scanf("%d",&n)&&n) { read(); //输入 cnt=0; get_point();//求交点 ans=0; get_area();//求面积 printf("%.6f ",ans); } return 0; }