天天写算法之最大三角形

一直看不太懂网上的凸包模板,索性就按照自己了解的来吧,一开始忘了初始化res,一直wa,心累

代码

#include<iostream>
#include<string.h>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAX 50005

using namespace std;

struct point{
    double x ;
    double y ;
}points[MAX];
int ans[MAX];//用于记录凸包的顺时针索引
int n ;
bool cmp(point a , point b )
{
    if(a.y==b.y)
        return a.x<b.x;
    return a.y<b.y;
}
double judge(point a, point b , point base )
{
     return (a.x - base.x)*(b.y-base.y)-(b.x-base.x)*(a.y-base.y);
}
int bk(int n)
{
    sort(points+1,points+n+1,cmp);
    int index=1;
    ans[1]=1 ;
    do{
        index++;
        int t = ans[index-1]+1;//找到上一次解决的点,+1得到下一个点
        if(t>n)
            t = 1 ;//注意这个地方,其实把最后的点也算了进去,也就是围城了一个圈,当把最后一个点算进去的时候才中止
        for(int i = 1 ; i<= n ; i ++)
        {
            if(judge(points[i],points[t],points[ans[index-1]])<0)
            {
                t = i ;
            }
        }//这个地方还很巧妙的把共线的情况也算了进去,很厉害,如果共线,那么上面的if肯定进不去,就会在上一个的基础上把t原封不懂得传递过来
        ans[index]=t;
    }while(ans[index]!=ans[1]);

    return index-1 ;
}

int main(){
    int i , j ,k,num;
  while(scanf("%d",&n)!=EOF)
  {
        for(i = 1 ; i <= n ; i++)
        {
            scanf("%lf%lf",&points[i].x,&points[i].y);
        }
        num = bk(n);
        double res = 0;
        for(i = 1; i <=num ; i++)
        {
            for(j = i+1 ; j <= num ; j++)
            {
                for(k = j+1 ; k<=num ; k ++)
                {

                        res = abs(max(res,judge(points[ans[k]],points[ans[j]],points[ans[i]])));
                }
            }
        }
        printf("%.2lf\n",0.5*res);
  }
  return 0 ;
}

阅读更多

没有更多推荐了,返回首页