POJ 3702 距离排序

原创 2015年11月19日 15:45:37

做完作业去百练上提交这道题目,发现去年的这几天的提交记录,WA了无数条也没有过 = = 也不是很懂为什么内排序的题目还会把这道题扒拉出来

思路很简单,把所有的点记录下来然后把每两个点的距离分别求出来然后和两个点的坐标一起存起来,最后进行排序

排序用qsort应该是不行的,快排是不稳定的算法,这道题对算法的稳定性有要求,所以直接bubble排序。

另外一个注意点是求距离的顺序,我用的是先求(1,2)(1,3)….(1,n)
再求(2,3)(2,4)..(2,n)
….(n-1,n)
这样顺序就没问题了

#include<iostream>
#include<iomanip>
#include<math.h>
#include<algorithm>
using namespace std;

#define maxp 12

struct points{
    int x,y,z;
};

typedef struct{
    points p1,p2;
    double val;
}Dis_t;

bool operator <(Dis_t a, Dis_t b){
    return a.val < b.val;
}

ostream & operator<<(ostream &output,Dis_t src){
    //(0,0,0)-(1,1,1)=1.73
    cout<<"("<<src.p1.x<<","<<src.p1.y<<","<<src.p1.z<<")-(";
    cout<<src.p2.x<<","<<src.p2.y<<","<<src.p2.z<<")=";
    cout<<fixed<<setprecision(2)<<src.val;
}

points point[maxp]={0};
Dis_t dis[maxp*maxp]={0};
int n;
int discount = 0;

double calcu(int i,int j){
    double dis0;
    double dx = point[i].x - point[j].x;
    double dy = point[i].y - point[j].y;
    double dz = point[i].z - point[j].z;
    dis0 = sqrt(dx*dx+dy*dy+dz*dz);
    //cout<<dis0<<endl;
    return dis0;
}

int main(){
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>point[i].x>>point[i].y>>point[i].z;
    }

    for(int i=0;i<n-1;++i){
        for(int j=i+1;j<n;++j){
            Dis_t tmp;
            tmp.p1 = point[i];
            tmp.p2 = point[j];
            tmp.val = calcu(i,j);
            dis[discount++] = tmp;
        }
    }

    //sort(dis,dis+discount);
    for(int i=0;i<discount-1;++i){
        for(int j =0;j<discount-i-1;++j){
            if(dis[j]<dis[j+1]){
                Dis_t t = dis[j];
                dis[j] = dis[j+1];
                dis[j+1] = t;
            }
        }
    }


    for(int i=0;i<discount;++i){
        cout<<dis[i]<<endl;
    }
    //system("pause");
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

poj_1007 排序水题

code: #include #include using namespace std; void quick_sort(char s[][51],int sort[],int left,...
  • yeruby
  • yeruby
  • 2015年01月27日 11:34
  • 722

DNA排序 poj

问题描述 : 知道逆序树是什么之后,就只要进行计算就行了,简单的说 :水题 我使用的方法就是先把字符串都放在一个二维数组中,之后给这个二维数组里面的数据求其 逆序数,之后再用选择排序就可以了。...
  • wretchedme
  • wretchedme
  • 2015年03月07日 07:57
  • 472

订餐系统之按距离[根据经纬度]排序、搜索

上周六,写了第一篇博客《订餐系统之权限设计》,在此感谢那些鼓励、关注我的园友们,更要感谢那些提出宝贵建议的朋友们。看了你们的评论,才真切的感受到:朋友们的评论往往会让文章更有看点。上篇文章中 郑...
  • jijunjian
  • jijunjian
  • 2016年06月07日 09:21
  • 2280

Microsoft SQL Server,错误: 3702

1、错误描述标题: Microsoft SQL Server Management Studio Express ------------------------------ 删除 对于 数据库“G...
  • you23hai45
  • you23hai45
  • 2017年03月18日 15:50
  • 1749

如何实现按距离排序、范围查找

简介现在几乎所有的O2O应用中都会存在“按范围搜素、离我最近、显示距离”等等基于位置的交互,那这样的功能是怎么实现的呢?本文提供的实现方式,适用于所有数据库。实现为了方便下面说明,先给出一个初始表结构...
  • ghsau
  • ghsau
  • 2016年01月30日 11:58
  • 21894

Java实现距离排序【Collections.sort】

一个简单的按距离排序的例子,算法是 计算两点之间的距离,并将这个距离按照从小到大(即从近到远)排序。运用Collections的sort方法实现按距离排序。 创建一个简单的实体类: /** *...
  • Abubu123
  • Abubu123
  • 2017年04月18日 15:45
  • 1178

solr空间搜索按距离排序

http://wiki.apache.org/solr/SpatialSearch/
  • awj3584
  • awj3584
  • 2013年11月13日 16:26
  • 3737

百度地图根据两点之间的距离进行排序

private const double EARTH_RADIUS = 6371; private static double deg2rad(double deg) {      return ...
  • qidiantianxia
  • qidiantianxia
  • 2013年05月07日 09:50
  • 1513

Project第三天 实现百度定位后计算距离和进行排序

承接第二天 前一天实现了百度定位之后,就利用百度地图定位功能对用户和指定的目标位置的距离进行计算。大致思路如下: 第一、首先我们要实现LocationManager中的观察者接口,第二天有介绍,实...
  • wei_xiaoshuo
  • wei_xiaoshuo
  • 2016年07月04日 20:58
  • 378

数据库中通过坐标计算距离并进行排序

select 2 * Asin(Sqrt(                 power(                 Sin((39.943305-lat)*3.1415926/180 / 2...
  • zzyonepiece
  • zzyonepiece
  • 2014年07月31日 14:27
  • 2927
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3702 距离排序
举报原因:
原因补充:

(最多只允许输入30个字)