您的位置:首页 > 其它

poj 1408 Fishnet

2012-05-19 11:12 253 查看
本题数据量不大 直接求解

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

取最大

#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

;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: