poj 1408 Fishnet

本题数据量不大 直接求解

先求出所有的交点,再枚举所有四边形的面积

取最大

#include<iostream>

#include<cmath>

#include<string>

#include<algorithm>

#include<queue>

#include<map>

#include<set>

#include<cstring>

#include<cstdio>



using namespace std;

const double K=1e-8;

const int N=35;

struct node

{

    double x,y;

}mem[N][N];

int n;

void findxy(int i,int j)//求交点的坐标

{

    double K2=(mem[n+1][j].y-mem[0][j].y)/(mem[n+1][j].x-mem[0][j].x);

    if(fabs(mem[i][n+1].x-mem[i][0].x)<K)//注意斜率不存在的情况

    {

        mem[i][j].x=mem[i][0].x;

        mem[i][j].y=(mem[i][j].x-mem[0][j].x)*K2+mem[0][j].y;

    }

    else

    {

        double K1=(mem[i][n+1].y-mem[i][0].y)/(mem[i][n+1].x-mem[i][0].x);

        mem[i][j].x=(mem[i][0].x*K1-mem[i][0].y+mem[0][j].y-K2*mem[0][j].x)/(K1-K2);

        mem[i][j].y=(mem[i][j].x-mem[0][j].x)*K2+mem[0][j].y;

    }

    //cout<<mem[i][j].x<<" "<<mem[i][j].y<<endl;

}

double Large(int i,int j)

{

    double x1=mem[i][j].x-mem[i-1][j-1].x;

    double y1=mem[i][j].y-mem[i-1][j-1].y;

    double x2=mem[i][j].x-mem[i][j-1].x;

    double y2=mem[i][j].y-mem[i][j-1].y;

    double x3=mem[i][j].x-mem[i-1][j].x;

    double y3=mem[i][j].y-mem[i-1][j].y;

    return (fabs(x1*y2-x2*y1)+fabs(x1*y3-x3*y1))/2.0;//将四边形分解成两个三角形,利用叉积求三角形面积 

}

int main()

{

    while(scanf("%d",&n)!=EOF,n)

    {

        mem[0][0].x=0.0;mem[0][0].y=0.0;

        mem[n+1][0].x=1.0;mem[n+1][0].y=0.0;

        mem[0][n+1].x=0.0;mem[0][n+1].y=1.0;

        mem[n+1][n+1].x=1.0;mem[n+1][n+1].y=1.0;

        for(int i=1;i<=n;++i)

        {

            scanf("%lf",&mem[i][0].x);mem[i][0].y=0.0;

        }

        for(int i=1;i<=n;++i)

        {

            scanf("%lf",&mem[i][n+1].x);mem[i][n+1].y=1.0;

        }

        for(int i=1;i<=n;++i)

        {

            scanf("%lf",&mem[0][i].y);mem[0][i].x=0.0;

        }

        for(int i=1;i<=n;++i)

        {

            scanf("%lf",&mem[n+1][i].y);mem[n+1][i].x=1.0;

        }

        double ans=0.0;

        for(int i=1;i<=n+1;++i)

        {

            for(int j=1;j<=n+1;++j)

            {

                if(i<=n&&j<=n)

                findxy(i,j);

                ans=fmax(ans,Large(i,j));

            }

        }



        printf("%.6f\n",ans);

    }

    return 0;

}

 

你可能感兴趣的:(poj)