POJ 1696 Space Ant(凸包变形)

来源:互联网 发布:程序员眼镜 编辑:程序博客网 时间:2024/04/30 14:16

POJ 1696 Space Ant(凸包变形)

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

题意:

       给你平面的一个点集,然后要你从y坐标最小的点开始以水平方向向下一个点连线,每次只能直走或左转,问你最多能走多少点?(输出所有走过的点,且不走回头路,所有点坐标均唯一)

分析:

       本题其实就是用极角排序,每次都有一个你的当前点,然后每次都贪心的走以当前点为中心的极角最小的那个点(如果有多个,就走距离当前点最近的那个点即可.)

       这样,我们能保证能走过的点数是最多的.

       为什么上述贪心算法是对的呢?其实这就是每次都在找最外层的凸包.


AC代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;//精度控制const double eps=1e-10;int dcmp(double x){    if(fabs(x)<eps) return 0;    return x<0?-1:1;}//点struct Point{    int id;    double x,y;    Point(){}    Point(int id,double x,double y):id(id),x(x),y(y){}}cur_point;//cur_point是当前参照点//向量typedef Point Vector;//点-点==向量Vector operator-(Point A,Point B){    return Vector(-1,A.x-B.x,A.y-B.y);}//叉积double Cross(Vector A,Vector B){    return A.x*B.y-A.y*B.x;}//距离的平方double Length2(Point A,Point B){    return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);}//用于排序的比较函数,这里对比的是与参照点的极角序bool cmp(const Point& A,const Point& B){    double c=Cross(A-cur_point, B-cur_point);    if(c>0) return true;    else if(c<0) return false;    double len1=Length2(A,cur_point);    double len2=Length2(B,cur_point);    return len1<len2;}const int maxn=50+5;Point p[maxn];int main(){    int T; scanf("%d",&T);    while(T--)    {        int n;        scanf("%d",&n);        cur_point=Point(0,1e10,1e10);        for(int i=0;i<n;i++)        {            scanf("%d%lf%lf",&p[i].id,&p[i].x,&p[i].y);            if(p[i].y<cur_point.y || (p[i].y==cur_point.y&&p[i].x<cur_point.x) )                cur_point=Point(p[i].id,p[i].x,p[i].y);        }        swap(p[0],p[cur_point.id-1]);//将y坐标最小的点交换到0号去        int ans[maxn];//按顺序记录所有点的原始编号        int cnt=0;        ans[cnt++]=cur_point.id;//第1个点        for(int i=1;i<n;i++)        {            sort(p+i,p+n,cmp);//把剩下的点按参照点从新极角排序            cur_point=p[i];            ans[cnt++]=cur_point.id;        }        printf("%d",cnt);        for(int i=0;i<cnt;i++)            printf(" %d",ans[i]);        printf("\n");    }    return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我的拼多多商家密码忘了怎么办 特约金服扣款连续扣了两次怎么办? 拼多多拒绝退款联系客服退款怎么办 镇江新设名称申报中字号怎么办 创维电视只有声音没有图像怎么办 京东E卡有密码忘记卡号怎么办? 香香鞋上的饰品老掉怎么办 联壁金融资金冻结提现不出来怎么办 联壁金融提现不到帐怎么办 联壁金融提现迟迟不到帐怎么办 客户说平安福现金价值低怎么办 2个月宝宝肚脐凸出来怎么办 西安华润万家预付卡丢了怎么办 租房签了一年合同想走怎么办 京东寄包裹在速递易里面该怎么办 翼码科技辅助码被删掉了怎么办 用别人的身份证注册的手机号怎么办 大v线做到假线了怎么办 有个摄像头网段不同搜不到怎么办 百度网盘离线下载有违规内容怎么办 抖音上传的照片与音乐不同步怎么办 社保卡里面的钱用完了怎么办 医保卡里面的钱用完了怎么办 手机通知栏变成了搜索栏怎么办 小米手机账号密码忘了手机号怎么办 暑假工没签合同押工资了的怎么办 在日本雅虎拍卖网站买到假货怎么办 没有百度糯米账号但是买票了怎么办 拼多多商家版登陆密码忘记了怎么办 安卓下载的软件闪退怎么办 老司机影视院开通会员看不了怎么办 梦幻西游手游苹果手机打不开怎么办 拼多多笔订单被判定虚假发货怎么办 苹果手机微信接收不到信息怎么办 内衣穿32太小穿34空杯怎么办 楼下的把下水管道堵死了怎么办?? 微信绑定的手机号码已停机怎么办 绑定微信的手机号停机了怎么办验证 绑定手机停机微信怎么验证码怎么办 五菱之光雨刷开关手柄断了怎么办 快手家长控制模式密码忘了怎么办