题目大意:就是求划分的四边形的最大面积,博哥叫我码这道水题玩玩,照码了~~1A呵呵~
思路:枚举,克莱姆求交点水过~~~
用二维数组结构体保存整个正方形内的点~~搞输入保存的时候有点恶心~~
AC program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iomanip>
#include<algorithm>
using namespace std;
double a[35],b[35],c[35],d[35];
int n;
int dir[4][2]={{0,0},{0,1},{1,1},{1,0}};//把握方向求面积
struct point
{
double x,y;
}inp[1000][1000];
void get_point(double & px,double & py, double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
{
//--
double a1, b1, c1, a2, b2, c2;
double D,D1,D2;
a1 = y1 - y2; // 由公式推出的关系
a2 = y3 - y4;
b1 = x2 - x1;
b2 = x4 - x3;
c1 = x2 * y1 - x1 * y2;
c2 = x4 * y3 - x3 * y4;
D = a1 * b2 - a2 * b1;
if (D)
{ // D != 0 运用Cramer法则求交点
D1 = c1 * b2 - c2 * b1;
D2 = a1 * c2 - a2 * c1;
px = (double)((double)D1 / D);
py = (double)((double)D2 / D);
}
//---
}
void init()
{
inp[n+1][0].x=0;//左xia角
inp[n+1][0].y=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
inp[n+1][i].x=a[i];///
inp[n+1][i].y=0;
}
inp[n+1][n+1].x=1;//右xia角
inp[n+1][n+1].y=0;
inp[0][0].x=0;
inp[0][0].y=1; //左上角
for(int i=1;i<=n;i++)///
{
cin>>b[i];
inp[0][i].x=b[i];///
inp[0][i].y=1;
}
inp[0][n+1].x=1;//右上角
inp[0][n+1].y=1;
for(int i=1;i<=n;i++)///
{
cin>>c[i];
inp[n-i+1][0].x=0; //n-i+1
inp[n-i+1][0].y=c[i]; ///
}
for(int i=1;i<=n;i++)///
{
cin>>d[i];
inp[n-i+1][n+1].x=1;
inp[n-i+1][n+1].y=d[i];///
}
/* for(int i=0;i<=n+1;i++)//输出样例来看看
{
for(int g=0;g<=n+1;g++)
//cout<<inp[i][g].x inp[i][g].x<<' ';
printf("(%f,%f) ",inp[i][g].x,inp[i][g].y);
cout<<endl;
} */
for(int i=1;i<=n;i++)
{
for(int g=1;g<=n;g++)
{
get_point(inp[i][g].x,inp[i][g].y,inp[i][0].x,inp[i][0].y,inp[i][n+1].x,inp[i][n+1].y,inp[0][g].x,inp[0][g].y,inp[n+1][g].x,inp[n+1][g].y); ///
}
}
/* for(int i=0;i<=n+1;i++)//再次输出样例来看看
{
for(int g=0;g<=n+1;g++)
//cout<<inp[i][g].x inp[i][g].x<<' ';
printf("(%f,%f) ",inp[i][g].x,inp[i][g].y);
cout<<endl;
} */
}
double multi(double x1,double y1,double x2,double y2)
{
//cout<<"x1 y1 x2 y2 "<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
return x1*y2-x2*y1;
}
double get_max(double mmmax)
{
for(int i=0;i<=n;i++)//注意i是从0开始
{
for(int g=0;g<=n;g++)
{
double sum=0;
//get_size()
for(int h=0;h<4;h++)//h
{
sum+=multi(inp[ i+dir[h][0] ][ g+dir[h][1] ].x, inp[ i+dir[h][0] ][ g+dir[h][1] ].y , inp[ i+dir[(h+1)%4][0] ][ g+dir[(h+1)%4][1] ].x, inp[ i+dir[(h+1)%4][0] ][ g+dir[(h+1)%4][1] ].y );
}
sum=fabs(sum)/2;//note!!!
//cout<<"i g sum "<<i<<" "<<g<<" "<<sum<<endl;
if(sum>mmmax)
{
mmmax=sum;
}
}
}
return mmmax;
}
int main()
{
while(cin>>n,n)
{
init();//初始化数组,处理输入 //按行来得出交点
double max=-100.0;
double tmp=get_max(max); //枚举n+1行,求出最大的面积;
cout<<fixed<<setprecision(6)<<tmp;
cout<<endl;
}
//system("pause");
return 0;}

本文介绍了一种通过枚举和克莱姆法则求解正方形内划分的最大四边形面积的方法。使用结构体数组存储点坐标,并通过方向判断计算四边形面积。
297

被折叠的 条评论
为什么被折叠?



