poj1113Wall

来源:互联网 发布:ps3模拟器卡顿优化 编辑:程序博客网 时间:2024/05/16 17:25

http://poj.org/problem?id=1113

正好是凸包的周长加一圆周 套一下各种叉积、距离的模板就OK了。

要确定一个最低点作为凸包的起点 这个点一定得为凸包上的点 找最低的若有多个找最左的 然后Graham-Scan算法。

按极角排下序,其实就是按某点到起点形成的向量与另一点到起点形成的向量的左右关系 很明显 叉积判。

#include <iostream>#include<cstdio>#include<cstring>#include<stdlib.h>#include<math.h>#include<algorithm>#define PI 3.1415927using namespace std;typedef struct node{    double x,y;}Point;Point p[1100],stack[1100];int top;double xmult(Point a,Point b,Point c){    return (a.x-c.x)*(b.y-c.y) - (b.x-c.x)*(a.y-c.y);}double dis(Point a,Point b){    return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));}bool cmp(Point a,Point b){    double t = xmult(a,b,p[1]);    if(t>0||(t==0&&dis(p[1],a)<dis(p[1],b)))    return true;    return false;}int main(){    int i,j,k,n,r;    Point t;    while(cin>>n>>r)    {        k = 1;top = 0;        for(i = 1; i <= n; i++)        {            cin>>p[i].x>>p[i].y;            if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))            k = i;        }        if(k!=1)        {            t = p[1];            p[1] = p[k];            p[k] = t;        }        sort(p+2,p+n+1,cmp);        stack[top++] = p[1];        stack[top++] = p[2];        stack[top++] = p[3];        for(i = 4; i <= n ; )        {            if(top<2||xmult(stack[top-1],p[i],stack[top-2])>=0)            {                stack[top++] = p[i++];            }            else            top--;        }        stack[top] = p[1];        double s = 0;        for(i = 0; i < top ; i++)        {            s+=dis(stack[i],stack[i+1]);        }        s+=PI*r*2;        printf("%0.lf\n",s);    }    return 0;}


 

原创粉丝点击