POJ1408 Fishnet

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

题目大意:就是求划分的四边形的最大面积,博哥叫我码这道水题玩玩,照码了~~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;} 


 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值