天天写算法之Surround the Trees

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

这个题目还是利用了chaji的思想,小于0,则顺时针,大于零则逆时针。

代码如下:

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

using namespace std;

struct point{
    double x ;
    double y ;
    friend operator == (point a , point b)
    {
        if(a.x==b.x&&a.y==b.y)
            return true ;
        return false ;
    }
}points[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);
}
double dis(point a,point b )
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double bk(int n)
{
    if(n==1)
        return 0 ;
    if(n==2)
        return dis(points[1],points[2]);
    int ans[MAX];
    ans[1]=1 ;
    int index= 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]);

    double res = 0;
    for(int i = 1 ; i < index ;i++)
    {

        res +=dis(points[ans[i]],points[ans[i+1]]);
    }
    return res ;
}

int main(){
    int i, j ;
    while(scanf("%d",&n),n)
    {
        for(i = 1 ; i <= n ; i ++)
        {
            scanf("%lf%lf",&points[i].x,&points[i].y);
        }
        sort(points+1,points+1+n,cmp);
        printf("%.2lf\n",bk(n));
    }
}

查看评论

HDU 1392 Surround the Trees(凸包模板)

Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other...
  • llwwlql
  • llwwlql
  • 2016-12-03 18:27:46
  • 217

Surround the Trees&&凸包入门题

Problem Description There are a lot of trees in an area. A peasant wants to buy a rope to surround ...
  • smallacmer
  • smallacmer
  • 2012-09-08 08:59:21
  • 650

杭电OJ(HDOJ)1392题:Surround the Trees(凸包问题)

题意: 一个土地上有N棵树,农夫想把所有的树用一根绳子绕起来,给出第棵的坐标(X,Y),求出绳子的最短长度。树至少有1棵,至多的100棵,坐标均为整数且不超过 32767。输出的最短长度保留两位小数。...
  • u014174811
  • u014174811
  • 2014-12-01 18:30:27
  • 752

Surround the Trees

Problem Description There are a lot of trees in an area. A peasant wants to buy a rope to surroun...
  • comeonchengzhihao
  • comeonchengzhihao
  • 2013-08-27 17:33:29
  • 386

车载全景可视系统surroundview

技术方案有哪些? 全景可视系统,也又称全景泊车等等,市面已经有产品出现,各家的方案看起来又不一样。 对全景,飞思卡尔freescale、富士通fujitsu拥有比较完整的解决方案,但也有其他公司推出自...
  • viewcode
  • viewcode
  • 2014-04-03 11:49:24
  • 5253

天天写算法之Maple trees

点击打开链接这个题目和前一个求周长的很相似,只不过现需要求出闭包的点来,然后再挨个计算三角形外接圆半径的最大值,最后+0.5得到结果。但是要钝角三角形的时候需要按其最长边计算,至于为什么我也不太清楚,...
  • qq_36616268
  • qq_36616268
  • 2018-04-17 22:13:30
  • 1

Facebook Surround360 学习笔记--(2)算法原理

本篇从宏观上介绍surround360的算法流程和每个步骤的原理,主要参考surround360官方网页(见参考)上的介绍。 Surround360开源项目包含了从相机阵列的硬件设计到图像拼接的软件算...
  • electech6
  • electech6
  • 2016-12-16 23:10:39
  • 3384

[字串、树、与序列的算法].[Algorithms.on.Strings.Trees.and.Sequences].(Dan.Gusfield).pdf

  • 2013年03月24日 23:08
  • 4.02MB
  • 下载

Surround the Trees(hdu 1392)

依旧是凸包题 Graham 扫描法: 但是有一些细节要注意,就是输入数据只有一个点或者两个点的时候。 #include #include #include using namespace st...
  • u013207805
  • u013207805
  • 2015-03-02 10:39:23
  • 273

1392 - Surround the Trees

凸包裸题。 #include #include #include #include #include #include #include #include using namespace std; ...
  • wamach
  • wamach
  • 2017-07-29 15:01:04
  • 93
    个人资料
    持之以恒
    等级:
    访问量: 1764
    积分: 1080
    排名: 4万+
    文章存档
    最新评论