先求凸包,然后再用旋转卡壳方法求解。
具体做法是枚举三角形的第一个点i,设j = i + 1,k = j + 1。然后做以下操作:
1.计算i,j,k构成的三角形面积a1和i,j,k + 1构成的三角形面积a2,如果a2 < a1,则进行下一步,否则k++,重复此步。
2.记录此时的三角形面积b,如果b < preb(就是上一个j对应的三角形面积)j++,转第一步,否则退出。
可以证明这个算法的复杂度为O(n2)。具体实现见代码。

/************************************************************************* 
Author: WHU_GCC 
Created Time: 2007-9-12 19:48:12 
File Name: b.cpp 
Description:  
***********************************************************************
*/
 
#include 
<iostream> 
using namespace std; 
#define out(x) (cout<<#x<<": "<<x<<endl) 
const int maxint=0x7FFFFFFF
typedef 
long long int64; 
const int64 maxint64 = 0x7FFFFFFFFFFFFFFFLL; 
template
<class T>void show(T a, int n){for(int i=0; i<n; ++i) cout<<a[i]<<' '; cout<<endl;} 
template
<class T>void show(T a, int r, int l){for(int i=0; i<r; ++i)show(a[i],l);cout<<endl;} 

const int maxn = 50010

typedef 
struct point_t 

    
int x, y; 
}


typedef 
struct polygon_t 

    
int n; 
    point_t p[maxn]; 
}


int operator <(const point_t &a, const point_t &b) 

    
return a.y < b.y || a.y == b.y && a.x < b.x; 
}
 

point_t 
operator -(const point_t &a, const point_t &b) 

    point_t ret; 
    ret.x 
= a.x - b.x; 
    ret.y 
= a.y - b.y; 
    
return ret; 
}
 

inline 
int cross(const point_t &a, const point_t &b) 

    
return a.x * b.y - a.y * b.x; 
}
 

int turn_left(const point_t &a, const point_t &b, const point_t &c) 

    
return cross(b - a, c - b) > 0
}
 

class point_set_c 

public
    
void init(int _n, point_t _p[]); 
    polygon_t convex_hull(); 
private
    
int n; 
    point_t p[maxn]; 
}


void point_set_c::init(int _n, point_t _p[maxn]) 

    n 
= _n; 
    
for (int i = 0; i < n; i++
        p[i] 
= _p[i]; 
}
 

polygon_t point_set_c::convex_hull() 

    
int stack[maxn]; 
    
int top = 1
    stack[
0= 0
     
    sort(p, p 
+ n); 
     
    
for (int i = 1; i < n;) 
    

        
if (top == 1 || turn_left(p[stack[top - 2]], p[stack[top - 1]], p[i])) 
            stack[top
++= i++
        
else top--
    }
 
    
int t_top = top; 
    
for (int i = n - 2; i >= 0;) 
    

        
if (top == t_top || turn_left(p[stack[top - 2]], p[stack[top - 1]], p[i])) 
            stack[top
++= i--
        
else top--
    }
 
     
    polygon_t ret; 
    ret.n 
= 0
    
for (int i = 0; i < top - 1; i++
        ret.p[ret.n
++= p[stack[i]]; 
    
return ret; 
}
 

point_t p[maxn]; 
int n; 
point_set_c ps; 
polygon_t poly; 

int main() 

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

        
for (int i = 0; i < n; i++
            scanf(
"%d%d"&p[i].x, &p[i].y); 
        ps.init(n, p); 
        poly 
= ps.convex_hull(); 
         
        
int ans = 0
        
for (int i = 0; i < poly.n; i++
        

            
int j = i + 1, k = j + 1
            
if (k >= poly.n) 
                
break
             
            
int area; 
            
int pre_area = -1
            
while (j < poly.n - 1
            

                area 
= cross(poly.p[j] - poly.p[i], poly.p[k] - poly.p[i]);                 
                
while (k < poly.n - 1
                

                    
int tmp = cross(poly.p[j] - poly.p[i], poly.p[k + 1- poly.p[i]); 
                    
if (tmp > area) 
                    

                        k
++
                        area 
= tmp; 
                    }
 
                    
else 
                        
break
                }
 
                
if (area < pre_area) 
                    
break
                pre_area 
= area; 
                ans 
>?= area; 
                j
++
                
if (j >= k) 
                

                    k 
= j + 1
                    
if (k >= poly.n) 
                        
break
                }
 
            }
 
        }
 
        printf(
"%.2lf\n", ans / 2.0); 
    }
 
    
return 0
}
 
posted on 2007-09-13 13:40 Felicia 阅读(840) 评论(0)  编辑 收藏 引用 所属分类: 计算几何

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理