关闭

hdu 1392

199人阅读 评论(0) 收藏 举报
分类:

代码转自【JustSteps】,其中,夹角扫描直接用向量叉乘写的很好!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
    int x,y;
};
node vex[1000];
bool cmp1(node a,node b)
{
    if(a.y==b.y)
        return a.x<b.x;
    else
        return a.y<b.y;
}


int cross(node,node,node);
double dis(node,node);


bool cmp(node a,node b)//与基准点所构成的向量与X轴正方向的角度排序
{
 int m=cross(vex[0],a,b);

 if(m==0)//如果选取的两点与基准点所构成的向量共线,选取更短的一点排在前面
  return dis(vex[0],a)-dis(vex[0],b)<=0 ? true : false; 
 else//如果不共线,通过叉乘运算,判断两向量的内外关系
  return m>0 ? true : false;
}


node stackk[1000];
int cross(node a,node b,node c)
{
    return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double dis(node a,node b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y));
}
int main()
{
    int t;
    while(scanf("%d",&t),t!=0)
    {
        int i;
        for(i=0;i<t;i++)
        {
            scanf("%d%d",&vex[i].x,&vex[i].y);
        }
        if(t==1)
            printf("%.2f\n",0.00);
        else if(t==2)
            printf("%.2f\n",dis(vex[0],vex[1]));
        else
        {
        sort(vex,vex+t,cmp1);//选出基准点
        sort(vex+1,vex+t,cmp);//通过基准点,按照与x轴的正方向的夹角排序

        memset(stackk,0,sizeof(stackk));
        stackk[0]=vex[0];
        stackk[1]=vex[1];//第一第二个加入凸包的边的集合是确定的
        int top=1;
        for(i=2;i<t;i++)
        {
            while(i>=1&&cross(stackk[top-1],stackk[top],vex[i])<0)   //发现边的连接不是逆时针方向的时候,删除,将下一个待测点连接,查看
                top--;                                           
            stackk[++top]=vex[i];                                    
        }


        double s=0;
        for(i=1;i<=top;i++)
            s+=dis(stackk[i-1],stackk[i]);
        s+=dis(stackk[top],vex[0]);//加回头和尾的边长
        printf("%.2f\n",s);
        }
    }
}
0
0
查看评论

HDU 1392 Surround the Trees【凸包周长】

转载请注明出处:http://blog.csdn.net/a1dark 分析:赤裸裸的凸包模板、我喜欢 #include #include #include #include #include using namespace std; struct node{ int x,y; }; node...
  • verticallimit
  • verticallimit
  • 2013-11-27 23:32
  • 1056

HDU 1392

这样不好。。。一天到晚就搞搞水题。。。 这题WA点就是凸包如果只有一个点的时候,输出0,两个点的时候输出距离 以上#include #include #include #include using namespace std; const double eps=1e-10; int dcmp(d...
  • pokemonn_getto_daze
  • pokemonn_getto_daze
  • 2016-08-05 23:36
  • 87

hdu 1392 模板凸包

这实在是太囧了……………………你妹的,我差点就这样了,明明就是一道模板,交了十几遍一直wa……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
  • HZXPH
  • HZXPH
  • 2011-08-03 15:26
  • 399

hdu 1392 Surround the Trees

凸包模板 #include #include #include #include #include #include #include using namespace std; const int N=105; const double eps=1e-8; struct poin...
  • cnh294141800
  • cnh294141800
  • 2014-03-18 21:08
  • 525

HDU 1392 Surround the Trees

平面凸包不过注意下两个点的时候 只输出距离就可以了 我也不知道为什么 没读懂题意 英文捉急!
  • sxb_201
  • sxb_201
  • 2016-03-11 18:20
  • 140

DB2报错SQLSTATE=57017 “code page "1392" ”

DB2报错SQLSTATE=57017 “code page "1392" ” $ db2 connect to payment SQL0332N  Chara...
  • a3470194
  • a3470194
  • 2013-11-20 17:03
  • 3256

HDU 1392 (计算几何 凸包)

题意是给你n个点求凸包的周长。 坑点是当凸包上的点只有两个的时候只要求一条线段的长度。 #include #include #include #include #include using namespace std; typedef unsigned long long ll; #d...
  • morejarphone
  • morejarphone
  • 2015-11-11 11:38
  • 205

hdu 1392(凸包)

传送门 题意:几乎是模板题,求凸包的周长用Graham扫描法解决(还有一个叫jarvis步行法,目测也差不多)。#include<cstdio> #include<cstring> #include<iostream> #include<algorithm...
  • KGV093
  • KGV093
  • 2017-08-15 15:49
  • 66

HDU 1392 HDU 1348 凸包

求凸包的周长,  注意n=1 , 2时特殊情况
  • u013491262
  • u013491262
  • 2014-08-15 12:10
  • 415

hdu 1392(凸包周长)

Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10996&...
  • baidu_34638825
  • baidu_34638825
  • 2017-04-28 20:34
  • 58
    个人资料
    • 访问:27252次
    • 积分:943
    • 等级:
    • 排名:千里之外
    • 原创:63篇
    • 转载:26篇
    • 译文:0篇
    • 评论:9条
    visitors
    最新评论