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 3702 Chessman 状态压缩 + 深搜

这道题是一道很好的搜索题,由于走四步会循环,所以可以压缩为0,1,2,3四种状态,判断第一个是否能转为第二个,就看两个串中这四个状态分别是否相等,如果相等,就能转化了。再者,走四步会循环,所以普通这么...

poj DNA排序

  • 2013年12月12日 14:23
  • 2KB
  • 下载

lucene4.3 按坐标距离排序

  • 2015年12月04日 15:38
  • 3.02MB
  • 下载

按经纬度搜索附近的人,并按距离排序的简单实现。

按经纬度搜索附近的人,并按距离排序的简单实现这是一种简单的实现,数据量不大的情况下还是能满足需求的,写在这里做一份记录。当然也希望有其他更好的方案。主要思路就是:先以自己的经纬度为中心,计算一定半径内...

根据用户经纬度,sql计算距离并排序

项目开发中,需要计算当前用户和商户的坐标距离,并排序。找到网上童鞋总结的,非常好用。感谢分享的童鞋,记录下 (lon1商户经度、lat1商户纬度。lon2用户经度、lat2用户纬度。其实无所谓谁是谁的...

JavaWeb日记——SQL和hibernate实现经纬度求距离并排序

我们在做定位的时候,App端获取到定位,经度和维度都是Double,获取附近的人,就要根据用户经纬度求出附近的人的距离,并按降序排序。以一个user表为例 表的结构如下CREATE TABLE `u...

Lucene 自定义按距离排序

测试类 package sort.distanceSort; import java.io.IOException; import org.apache.lucene.analysis....

openjudge 距离排序

题目题目: 1:距离排序 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 给出三维空间中的n个点(不超过10个),求出n个点两两之间的距离,并按距离由大...
  • mach7
  • mach7
  • 2014年03月26日 17:44
  • 1303

Java二叉树排序及任意两点个节点间的最大距离

网上看到的基本都是c或c++实现的,参照同样的算法写了个java版的。 参考文章地址:http://blog.csdn.net/cxh342968816/article/details/665647...

LBS经纬度搜索和距离排序 各种方案

看到最近有好多人陆续收藏、关注这个问题,特来更新一下 建议使用ElasticSearch(https://elastic.co)进行LBS业务功能开发 PostGIS也是不错的 Redis新版有...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3702 距离排序
举报原因:
原因补充:

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